prototype,__proto__,constructor

  1. proto属性:
    所有对象都有此属性。但它不是规范里定义的属性,并不是所有JavaScript运行环境都支持。它指向对象的原型,也就是你说的继承链里的原型。通过Object.getPrototypeOf方法也可以获取对象的原型。

  2. prototype属性:
    只有函数—准确地说是构造函数—才有此属性,比如Math. pow这样的非构造函数就没有此属性。构造函数是干嘛的?是用来构造(即new)对象的。prototype就是为构造对象这个过程服务的,它指明了构造函数将要创建出来的对象的原型是谁,这样当你new出一个对象时,才知道把这个对象放到原型链的哪个位置。注意:prototype是可以修改的,修改后,用构造函数new出来的对象的原型相应地也会发生变化。另外,instanceof操作也依赖此属性的值。

  3. 前面两个的关系
    从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属性不一样。那么这个属性有什么用呢?答案就是:它是给用户代码使用的。比如通过它,就可以知道一个对象的构造函数是谁了。当然前提是它没有被修改。

  1. 你的问题
    问题: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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值