关于JavaScript中 原型继承有一点不理解

原型继承中有一步是

Zi.prototype = Object.create(Fu.prototype);

这样造成的结果是不是

Zi.prototype.__proto__===Fu.prototype

如果是的话为啥不直接

Zi = Object.create(Fu.prototype);

这样的话

Zi.__proto__===Fu.prototype

Zi的原型链少一层岂不是更方便?
另外问一下

Zi.prototype.constructor = Zi;

到底有什么实际用途

阅读 2.5k
3 个回答

看起来楼主混淆了两个概念:函数和对象。
看你写的原型继承这里:

Zi.prototype = Object.create(Fu.prototype);

你知道这里的Zi是什么吗?你的上下文没有说明Zi的定义,但是他有prototype这个属性,所以我推断他是一个函数。
然后看这行代码:

Zi = Object.create(Fu.prototype);

那这里的Zi又是什么呢?这里的ZiObject.create的返回值,这是一个对象!!
所以这两个有啥区别?
这两个有本质区别啊!上面的Zi是函数,可以直接用Zi()调用,下面的Zi是对象,不能作为函数调用啊!

下个问题,这行代码到底有啥用?

Zi.prototype.constructor = Zi;

一般的你创建一个函数:

Zi = function(){}

他的原型上会有一个Zi.prototype.constructor,这个值就是Zi。当你运行了
Zi.prototype = Object.create(Fu.prototype);
这个值会被改为Fu.prototype.constructor,也就是Fu,所以需要重置回来。

上面说了这么多,其实讲得也不够透彻,你想深入了解原型链需要懂JS的面向对象,推荐你看下这篇文章,讲的很透彻:https://segmentfault.com/a/11...

额 这个是class继承吧?

Zi = Object.create(Fu.prototype);

直接赋值,Fu对象赋值给了Zi对象。

Zi.prototype = Object.create(Fu.prototype);

将Zi的原型链指向Fu, Zi本身没有Fu的属性方法。
好处是: 更轻了,试想下创建很多个Zi对象,是赋值很多个Zi好呢,还是只需要指原型链好

Zi.prototype.constructor = Zi;

是因为Zi = Object.create(Fu.prototype);造成了

Zi.prototype.constructor = Fu.prototype.constructor

的后果,现在将构造函数更正为Zi

推荐问题
宣传栏