Javascript 多重继承控制台输出

Javascript 多重继承控制台输出,javascript,html,Javascript,Html,我正在使用下面的代码。我的代码输出控制台出错了。现在我得到的是“这是aB”,但我需要在输出控制台上输出与构造函数相关的输出。第一个是aA,第二个是aB,第三个是aC function A () { this.name = "A"; } A.prototype.a = function () { console.log("this is a"+this.name); } function B () { this.name = "B"; } B.prototype.b = func

我正在使用下面的代码。我的代码输出控制台出错了。现在我得到的是“这是aB”,但我需要在输出控制台上输出与构造函数相关的输出。第一个是aA,第二个是aB,第三个是aC

function A () {
  this.name = "A";
}

A.prototype.a = function () {
  console.log("this is a"+this.name);
}

function B () {
  this.name = "B";
}

B.prototype.b = function () {
  console.log("this is b"+this.name);
}

function C() {
   this.name = "C";

    A.call(this);
    B.call(this);
}

C.prototype = Object.assign({}, A.prototype, B.prototype);
C.prototype.constructor = C;

C.prototype.c = function () {
  console.log("this is c"+this.name);
}

var x = new C();

x.a(); //this is aB
x.b(); //this is bB
x.c(); //this is cB

在所有三个构造函数中都指向同一个对象:由
new
操作符创建的对象。一个对象只能有一个属性。因此,无论您最后调用哪个构造函数,都将“赢”,并且名称将由该构造函数指定。因此,您一直在看到B,因为即使使用
newc
,首先
C
写入C,然后
A
写入A(覆盖C),最后
B
写入B(覆盖A)

如果您希望与层次结构中的每个级别相关的代码都有自己的
名称
属性,您不能真正做到这一点,但您可以让每个级别都使用自己的属性(例如
nameA
nameB
nameC
)。通过使用括号表示法和每个级别的所有代码共享的变量,可以不需要记住编写代码的级别

我不建议这样做。无论你试图解决的实际问题是什么,都可能有更好的解决方案

但以下是你的做法:

var A=(函数(){

var name=“nameA”;//您引用的输出不是该代码的输出。您已经显示了三次
aB
。事实上,输出是
aB
bB
、和
cB
(如果我们忽略由于您正在记录调用方法的结果而记录的
未定义的
,但这些方法不会返回任何内容)。我已经解决了上述评论中提出的问题,仅供参考。(FWIW,如果您对私有字段的工作方式感兴趣,我将在我的新书JavaScript:the new Toys(JavaScript:the new Toys,涵盖ES2015-ES2020)中深入介绍它们。我的个人资料中有详细信息和链接。)