proto属性:
所有对象都有此属性。但它不是规范里定义的属性,并不是所有JavaScript运行环境都支持。它指向对象的原型,也就是你说的继承链里的原型。通过Object.getPrototypeOf方法也可以获取对象的原型。prototype属性:
只有函数—准确地说是构造函数—才有此属性,比如Math. pow这样的非构造函数就没有此属性。构造函数是干嘛的?是用来构造(即new)对象的。prototype就是为构造对象这个过程服务的,它指明了构造函数将要创建出来的对象的原型是谁,这样当你new出一个对象时,才知道把这个对象放到原型链的哪个位置。注意:prototype是可以修改的,修改后,用构造函数new出来的对象的原型相应地也会发生变化。另外,instanceof操作也依赖此属性的值。前面两个的关系
从2.可以看出,当你用构造函数C构造出一个对象obj时,存在下面的等式:
C.prototype === obj.ptoto;
4. constructor属性:
并不是所有对象都有此属性。比如上面new出来的对象obj并没有这个属性,或者说这个属性不是对象obj的“own property”,它实际上是挂在它的原型上面的,即C.prototype.constructor。每个构造函数C刚被制造出来的时候,它的C.prototype上面都会有一个constructor属性,并且执行它本身,即
C. prototype.constructor === C;
当构造函数制造出一个新的对象时,这个属性就被新对象继承了。这个属性并不会被JavaScript引擎内部使用,所以你随便修改它并不会对引擎内部产生影响,注意这一点跟prototype属性不一样。那么这个属性有什么用呢?答案就是:它是给用户代码使用的。比如通过它,就可以知道一个对象的构造函数是谁了。当然前提是它没有被修改。
- 你的问题
问题:prototype是属性?.proto.叫原型对象? 到底是叫什么 原型链中的原型对象是指的prototype还是.proto.?
回答:1. prototype是属性。2. 准确地说是.proto.指向对象的原型对象。3. 前者总是指向原型对象,后者在没有被修改过的情况下也是指向原型对象的。
问题:属性的查找是原型链的查找过程 原型链的顶端是Object.prototype 如果没有找到就返回undefindObject.prototype.proto===null 不是应该最终找到null么?
回答:不是,找到null时还找不到,就返回undefined。
问题:Object是由Function构造出来的?Object.constructor ===Function // true
回答:实际上不是,只是逻辑上是,所以为了逻辑上的融洽,JS引擎把Object.constructor强行指向了Function。
问题:原型链是根据什么查找的 是prototype还是.proto. 还是根据constructor指针
回答:谁都不是,或者当然也可以说是根据.proto.属性所指向的那个内部对象。你要清楚,prototype、.proto. 和constructor只是三个名字,三个由引擎暴露出来给用户代码用的API。就算你把它们都删除了(加上可以删除的话),它们原来指向的那个对象,在对象内部仍然有内部属性指向它。例如,.proto.其实与内部属性[[prototype]]指向相同的对象,引擎在向上查找原型链时正是通过[[prototype]]进行的。所以这个问题的答案是[[prototype]]。
回答完毕,手机回答可能有误,敬请大家指正。
没地方记了:糗百API:
http://m2.qiushibaike.com/article/list/suggest?page=1&type=refresh&count=30