dog是函数对象,本身没有price属性,此时dog的__proto__属性指向的是其构造函数的原型。
我想,题主对于构造函数和原型对象的概念理解的还不够透彻。
所谓构造函数,是生成一个对象的模板,是生成对象的函数。一个构造函数,可以生成多个实例对象,每个实例对象都有相同的结构。
接以上的例子,当你使用new操作符调用Keith构造函数时,会经历以下步骤:
1.创建一个空对象,作为将要返回的实例对象
2.将空对象的原型指向构造函数的prototype属性,也就是Keith构造函数的prototype属性。
3.将空对象赋值给构造函数内部的this关键字,也就是this关键字会指向实例对象。
4.开始执行构造函数内部的代码。
题主的第一个问题是,Keith.prototype指向实例原型,但是它具体指向什么?
当然了,person2实例对象也是如此。
另外。当为构造函数定义原型属性,并且访问原型属性时,
但是这样访问一个原型属性是没有意义的。而是应该通过对象实例来访问原型属性。
person1实例对象本身是没有mm属性的,所以会在原型Keith.protoype上查找。在原型找到了mm属性,所以就继承了原型的mm属性。若原型上没有mm属性,会继续在原型的原型上查找,直到null对象,若还是没有该属性,则返回undefined。
回答题主的最后一个问题:car是构造函数 OMakeNewCar 的实例,为什么car.prototype指向的不是构造函数?
从例子上面的说明,我想题主应该知道原因了。构造函数只是提供创建对象的模板,而不是原型对象。所以person1.prototype指向的不是构造函数,而是构造函数的原型。
这里稍微改正一下,是personal1._proto_的内部属性指向了原型对象