这几天写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
属性,目的就是为了完成上面的继承方式。
以上个人理解,如有错误欢迎指正。