关于对象实例的原型为什么是undefined?

2018-12-07  本文已影响9人  MrOldK

    这几天写Blog,加深了之前的一个点,就是对象实例的原型其实是undefined
    如下例子:

function Test(name) {
  this.name = name
}
let test1 = new Test('yourName')
Test.prototype // {constructor:function Test(){}}
Test.constructor // function Function() {}
test1.constructor // function Test() {}
test1.prototype // undefined

    众所周知,实例调用属性和方法,会沿着原型链向上查找,直到找到最顶层的对象,那最顶层的对象是啥呢?看下面的例子:

Object.prototype // Object {}
Object.prototype._proto_ // undefined 

    所以,个人理解为最顶层的对象就是undefined
    好,接下来回到最初的那个问题:对象实例的原型为什么是undefined?
    原因就在于:
1)只有函数才有prototype属性。
2)所有对象都有_proto_属性,指向原型对象。
3)所有函数的_proto_都默认指向function Function() {}prototype
      所有对象的_proto_都默认指向function Object() {}prototype

也可以这样认为,函数prototype存在的意义就是在于当通过new操作符生成实例的时候,实例能够继承函数prototype指向的原型对象。

    在创建对象的时候会自动创建一个_proto_属性,指向它构造函数的prototype,当访问这个对象的属性的时候会顺带访问_proto_中对应的属性,也就是构造函数prototype,这样实现了继承。只有创建函数的时候才会创建一个prototype属性,目的就是为了完成上面的继承方式。

    以上个人理解,如有错误欢迎指正。

上一篇 下一篇

猜你喜欢

热点阅读