首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于多个原型的Javascript原型继承

基于多个原型的Javascript原型继承
EN

Stack Overflow用户
提问于 2019-09-11 09:49:03
回答 2查看 135关注 0票数 2

当这种继承扩展到多个对象之间时,我在javascript原型继承方面遇到了一些问题:当然,我做错了什么,但目前我无法理解什么。

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

举个例子:

考虑以下对象

  • 对象A
    • 扩展函数ab的原型
    • 扩展函数cd原型

  • 对象B
    • 扩展A

  • 对象C
    • 扩展B
    • 具有扩展函数ef的原型

  • 对象D
    • 扩展C

这里是这些对象的一个例子,我已经对它们进行了定义:

对象A

代码语言:javascript
复制
function A () {
    this.someproperty = someValue;
}

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

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

对象B

代码语言:javascript
复制
function B () {
    A.call(this);

    this.someOtherProperty = someValue;
}

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

对象C

代码语言:javascript
复制
function C () {
    B.call(this);
}

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

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

对象D

代码语言:javascript
复制
function D () {
    C.call(this);

    this.someOtherProperty = someValue;
}

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

考虑到上面的例子,我期望将变量初始化为"new“,这样的变量应该有可用的方法ab、cd和ef,可以用

  • variable.ab()
  • variable.cd()
  • variable.ef()

相反,所有这些似乎都是没有定义的。

请考虑一下,如果我将“新B”初始化为:

  • variable.ab()
  • variable.cd()

定义和工作

,我是不是做错了什么,或者原型继承不能扩展到多个对象上?

谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-09-11 09:55:37

代码语言:javascript
复制
B.prototype = A.prototype;

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

代码语言:javascript
复制
B.prototype = Object.create(A.prototype);
票数 6
EN

Stack Overflow用户

发布于 2019-09-11 10:14:38

下面是用ES6类重新编写的代码。@mbojko的答案是非常正确的(所以请接受一个,而不是这个,因为@mbojko直接回答了您的问题),但是,如果您要使用这种类型的深度类继承(许多人会争辩说您不应该使用--我倾向于认为有些问题是正确的,但您肯定需要谨慎),我建议使用ES6类来代替--使用更清晰的语法和更多的防范错误用法。

代码语言:javascript
复制
class A{
  constructor (){
    this.someproperty = 0;
  }

  ab(){
    //...
    return "called ab method"
  }
  cd(){
    //...
  }
}

class B extends A{
  constructor(){
    super();
    this.someOtherProperty = 1;
  }
}

class C extends B{
  ef(){
    //...
  }
}
class D extends C{
  constructor(){
    super();
    this.someOtherProperty = 2;
  }
}

const d=new D();
console.log(d.ab());
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57886467

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档