gpt4 book ai didi

多个原型(prototype)上的 Javascript 原型(prototype)继承

转载 作者:行者123 更新时间:2023-12-03 09:59:55 24 4
gpt4 key购买 nike

当这种继承在多个对象之间延伸时,我遇到了 javascript 原型(prototype)继承的一些问题:我肯定做错了什么,但目前我不明白是什么。

当扩展一个已经扩展了原型(prototype)的原型(prototype)时,整个 Prototype 的继承系统似乎失去了可用的方法。

一个例子:

考虑以下对象

  • 对象A
    • 具有扩展功能的原型(prototype)
    • 带有扩展功能的原型(prototype) cd
  • 对象B
    • 扩展 A
  • 对象C
    • 扩展B
    • 具有扩展功能 ef 的原型(prototype)
  • 对象D
    • 扩展 C

这是我定义的这些对象的示例:

对象 A

function A () {
this.someproperty = someValue;
}

A.prototype.ab = function () {
// does something
}

A.prototype.cd = function () {
// does something
}

对象 B

function B () {
A.call(this);

this.someOtherProperty = someValue;
}

B.prototype = A.prototype;
B.prototype.constructor = B;

对象 C

function C () {
B.call(this);
}

C.prototype = B.prototype;
C.prototype.constructor = C;

C.prototype.ef = function () {
// does something
}

对象 D

function D () {
C.call(this);

this.someOtherProperty = someValue;
}

D.prototype = C.prototype;
D.prototype.constructor = D;

给出上面的例子,我希望将一个变量初始化为“new D”,这样的变量应该有可用的方法 ab、cd 和 ef,可以通过

  • 变量.ab()
  • 变量.cd()
  • 变量.ef()

似乎所有这些都是未定义的。

请考虑如果我改为初始化“new B”:

  • 变量.ab()
  • 变量.cd()

已定义且有效

我是不是做错了什么或者原型(prototype)继承不能过度扩展到多个对象?

谢谢!

最佳答案

B.prototype = A.prototype;

不是继承,是覆盖:A.prototypeB.prototype成为同一个对象。应该是

B.prototype = Object.create(A.prototype);

关于多个原型(prototype)上的 Javascript 原型(prototype)继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57886467/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com