2 回答
TA贡献1829条经验 获得超7个赞
不是很理解这段代码的用途和意义,所以只能大概分析下,可能对也可能错。
首先简化下:
function A(){
};
// A.prototype = B();
// 得到一个 A 的实例
const instanceA = B();
A.prototype = instanceA;
function B(){
return new A();
}
// B.prototype = new B();
// 得到一个 B 实例,实际这个实例是 A 的实例
const instanceB = new B();
B.prototype = instanceB;
function A
在没有对A.prototype赋值前,是这样的:
如果获取A的实例上的属性时没有找到,就会到原型上找,就是右边的那个{ constructor: Function A },所以instanceA.toString最终是在Object上找到的。
到这里都能理解对吧,OK,然后,将A.prototype指向一个新对象,变成了这样:
如果给instanceA添加任意属性:
function A(){
};
// A.prototype = B();
// 得到一个 A 的实例
const instanceA = B();
instanceA.sayHello = function () {
console.log('hello A');
}
A.prototype = instanceA;
然后再实例化A得到的新实例,都有sayHello方法,因为会到instanceA上寻找,这里可以自己动手试试。
const test = new A();
test.sayHello(); // hello A
function B
再来分析B构造函数。
对,就是这样,和function B没有任何关系。
TA贡献1770条经验 获得超3个赞
function B的结果返回一个A的实例
A.prototype = B();
做一下等价替换
A.prototype = new A();
如果一个构造函数返回一个对象,则它的实例的原型为这个对象
所以 B生成的实例的原型也是A
添加回答
举报