js原型继承的问题

今天在读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中找过的啊。
求大神解答我的理解哪错了,感激不尽!!!

阅读 2.3k
3 个回答

首先,实例b并不会在B()去找name属性。再者,你修改以后,name是从b本身找到的属性,并不是在B()中找到的。看下面这个例子:

var A = function(){};
A.prototype = { name: 'sven' };

var B = function(){};
B.prototype = new A();

var b = new B(this.name = 5);
console.log( b.name );

就以这个例子来讲,b通过构造函数B()创建以后,b其实是这样的:

b = {name: 5};
b.__proto__ = B.prototype;

B.prototype是通过构造函数A()创建的,所以B.prototype是这样的:

B.prototype = {};
B.prototype.__proto__ = {name: 'sven'};

看明白了吗,通过构造函数创建的实例,拥有构造函数通过this.name = 5;赋予的属性,因为构造函数中的this指向实例对象。实例对象b并不会去构造函数中寻找属性name,它先在自己内部找name,找不到的话,会沿着__proto__去找name。就是这条路径:b.__proto__ = B.prototype; B.prototype.__proto__ = {name: 'sven'};也就是依次在B.prototypeA.prototype中去找name

【JavaScript】【对象】更好地理解对象继承这篇文章,希望能对你有所启发。

首先,尝试遍历对象b中的所有属性,但没有找到name这个属性。

你自己都说了啊

因为b的——proto——直接找到的是B的prototype,而B的属性都在B的prototype中存着,所以不用去B()中找

推荐问题
宣传栏