js的原型及原型链问题

帮我分析下,这个具体是如何的,谁是谁的谁啊,一头雾水,想画个草图出来,都不知道画的对应谁了

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

最好画图,分析出A,A的原型,A的实例以及相应B的,谢谢,我已经被绕晕了,弄不清楚了

阅读 2.6k
3 个回答

不是很理解这段代码的用途和意义,所以只能大概分析下,可能对也可能错。

首先简化下:

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没有任何关系。

function B的结果返回一个A的实例

A.prototype = B();

做一下等价替换

A.prototype = new A();

如果一个构造函数返回一个对象,则它的实例的原型为这个对象
所以 B生成的实例的原型也是A

图片描述图片描述

确实跟B没有任何关系 上面图有问题

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题