Javascript 多重继承控制台输出
我正在使用下面的代码。我的代码输出控制台出错了。现在我得到的是“这是aB”,但我需要在输出控制台上输出与构造函数相关的输出。第一个是aA,第二个是aB,第三个是aCJavascript 多重继承控制台输出,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
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)中深入介绍它们。我的个人资料中有详细信息和链接。)