今天在读JavaScript设计模式与开发实践,有一段代码如下:
var A = function(){};
A.prototype = { name: 'sven' };
var B = function(){};
B.prototype = new A();
var b = new B();
console.log( b.name );
书上的解释是:
首先,尝试遍历对象b中的所有属性,但没有找到name这个属性。
查找name属性的请求被委托给对象b的构造器的原型,它被b.__proto__ 记录着并且指向B.prototype,而B.prototype被设置为一个通过new A()创建出来的对象。
在该对象中依然没有找到name属性,于是请求被继续委托给这个对象构造器的原型A.prototype。
在A.prototype中找到了name属性,并返回它的值。
有一块不怎么理解
为什么不先在B中找,再到B.prototype找,而是直接到了B.prototype中。
而如果我把B修改下:
var B = function(){this.name = 5}
console的结果是5,而不是sven。说明是在B中找过的啊。
求大神解答我的理解哪错了,感激不尽!!!
首先,实例
b
并不会在B()
去找name
属性。再者,你修改以后,name
是从b
本身找到的属性,并不是在B()
中找到的。看下面这个例子:就以这个例子来讲,
b
通过构造函数B()
创建以后,b
其实是这样的:而
B.prototype
是通过构造函数A()
创建的,所以B.prototype
是这样的:看明白了吗,通过构造函数创建的实例,拥有构造函数通过
this.name = 5;
赋予的属性,因为构造函数中的this
指向实例对象。实例对象b
并不会去构造函数中寻找属性name
,它先在自己内部找name
,找不到的话,会沿着__proto__
去找name
。就是这条路径:b.__proto__ = B.prototype;
B.prototype.__proto__ = {name: 'sven'};
也就是依次在B.prototype
和A.prototype
中去找name
。【JavaScript】【对象】更好地理解对象继承这篇文章,希望能对你有所启发。
你自己都说了啊
因为b的——proto——直接找到的是B的prototype,而B的属性都在B的prototype中存着,所以不用去B()中找