为了账号安全,请及时绑定邮箱和手机立即绑定

js的原型及原型链问题

js的原型及原型链问题

蓝山帝景 2019-03-03 15:35:46
帮我分析下,这个具体是如何的,谁是谁的谁啊,一头雾水,想画个草图出来,都不知道画的对应谁了    function A(){};    function B(){        return new A();    }    A.prototype = B();    B.prototype = new B();最好画图,分析出A,A的原型,A的实例以及相应B的,谢谢,我已经被绕晕了,弄不清楚了
查看完整描述

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赋值前,是这样的:

https://img1.sycdn.imooc.com//5c7e223b000140d808000542.jpg

如果获取A的实例上的属性时没有找到,就会到原型上找,就是右边的那个{ constructor: Function A },所以instanceA.toString最终是在Object上找到的。


到这里都能理解对吧,OK,然后,将A.prototype指向一个新对象,变成了这样:


https://img1.sycdn.imooc.com//5c7e22430001592108000551.jpg


如果给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构造函数。

https://img1.sycdn.imooc.com//5c7e224c0001c59e08000473.jpg

对,就是这样,和function B没有任何关系。


查看完整回答
反对 回复 2019-03-05
?
德玛西亚99

TA贡献1770条经验 获得超3个赞


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


A.prototype = B();

做一下等价替换


A.prototype = new A();

如果一个构造函数返回一个对象,则它的实例的原型为这个对象

所以 B生成的实例的原型也是A


查看完整回答
反对 回复 2019-03-05
  • 2 回答
  • 0 关注
  • 504 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信