JS在设计之初 根本没有类的概念(现在也没有)为了实现实例对象的属性和方法的共享,就给function对象设计流一个prototype的概念,prototype是函数对象上面预设的对象属性。
简单的说 JS是基于原型的语言,当我们调用一个对象的属性时,如果该对象没有该属性,JS解释器就会从对象的原型对象上去找该属性,如果原型上也没有该属性,就去找原型的原型 直到最后返回null.这种属性查找的方式称为prototype chain.

在JS中 原型也是一个对象 通过原型可以实现对象的属性继承。JS对象都包含了一个[prototype]的内部属性,这个属性所对应的值就是该对象的原型。
[prototype]作为对象的内部属性 是不能被直接访问的。所以为了方便查看一个对象的原型,firefox和chrome中提供了"proto"这个非标准的访问器。

prototype
prototype是函数对象上面预设的对象属性
1. JS中所有的东西都是对象,每个对象都有prototype这个属性,这个属性是一个对象(object)
2. JS中所有的东西都由Object衍生而来, 即所有东西原型链的终点指向Object.prototype(就是说object是父类)
3. JS中构造函数和实例(对象)之间有微妙的关系,构造函数通过定义prototype来约定其实例的规格, 再通过 new 来构造出实例, 他们的作用就是生产对象。而构造函数(方法)本身又是方法(Function)的实例, 因此也可以查到它的__proto__(原型链)

看下面的代码:

var TestPrototype = function () { //定义了一个叫TestPrototype的函数对象(就像类一样)
    this.propA = 1; //定义了这个函数对象的属性:propA
    this.methodA = function() { //定义了这个函数对象的方法:methodA
        return this.propA; //返回当前对象的propA属性
    }
}

TestPrototype.prototype = { //定义这个函数对象的prototype属性 因为这个属性是预设的 所以不用提前声明
    methodB: function() { //在原型里面直接定义方法methodB
        return this.propA; 
    }
}

var objA = new TestPrototype(); // 新建一个TestPrototype实例

objA.methodA() // 调用methodA
objA.methodB() // 调用methodB

typescript中prototype是什么 prototype指向什么_构造函数


尤其注意:

这个类:TestPrototype

这个类有两个方法 一个是我们自定义的 叫methodA, 另一个是预定义的:_proto_方法,如果我们继续在这个方法里面定义方法,那么自然而然这个方法也会自带一个_proto_方法。

我们要知道 Object.prototype的proto属性是个访问器属性 一个getter和setter函数 ,他可以公开访问它的对象的内部[prototype]不管这个是对象还是Null(原型链的顶端)然后接下来的就看不懂了…搞不明白为什么objA和objB不一样…

总结:

说实话:还是没有完全搞懂 反而更乱了。请参见《用例子彻底理解JavaScript Prototype(原型)》

JS是基于原型的语言

想想我们是怎么创建新对象的:var obj = {}其实最终是通过var obj = new Object()创建的。是不是和上面的例子很像:通过new 构造函数 生成一个对象。

当我们创建一个对象后,就可以通过“点”方法名的方式调用一些并不是我们手写的方法了,如obj.toString()

typescript中prototype是什么 prototype指向什么_原型链_02


其实我们调用的是Object.prototype.toString。现在是不是对 JavaScript 是基于原型的语言这句话有些理解了。

其实不止Object是这样的,Array、String、Number等都是这样的原理。

JS一切皆对象

typescript中prototype是什么 prototype指向什么_原型链_03


是不是很神奇,居然全等。想想这是为什么?还记得上面说的原型链吗?