我正在使用下面的代码。我的代码输出控制台出错了。现在我得到"这是一个B"但我在输出控制台上需要与构造函数相关的输出。喜欢"这是a"首先,"这是a"第二,"这是aC"第三个控制台。
libnetwork
答案 0 :(得分:1)
this
引用同一个对象:new
运算符创建的对象。那个对象只能有一个 name
属性。所以你最后调用的构造函数将是#34; win"并且名称将由此分配。因此,您始终会看到B,因为即使使用new C
,第一个C
也会写入C,然后A
会写入A(覆盖C),最后B
写B(覆盖A)。
如果您希望与层次结构中每个级别相关的代码具有自己的name
属性,那么您无法真正做到这一点,但是您可以通过让每个级别使用自己的属性来接近(例如,{{ 1}},nameA
和nameB
)。您可以通过使用括号表示法和每个级别的所有代码共享的变量,以不需要您记住您编写代码的级别的方式执行此操作。
我不推荐。无论您尝试解决的实际问题是什么,都可能是更好的解决方案。
但是,你可以这样做:
nameC

var A = (function() {
var name = "nameA"; // <== We declare a variable and put this level's property name in it
function A () {
this[name] = "A"; // <== Note we're using brackets notation here
}
A.prototype.a = function () {
snippet.log("this is a"+this[name]); // <== Brackets again here
};
return A;
})();
var B = (function() {
var name = "nameB"; // <== Same again for B
function B () {
this[name] = "B";
}
B.prototype.b = function () {
snippet.log("this is b"+this[name]);
};
return B;
})();
var C = (function() {
var name = "nameC";
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 () {
snippet.log("this is c"+this[name]);
};
return C;
})();
var x = new C();
x.a(); //this is aA
x.b(); //this is bB
x.c(); //this is cC
&#13;
所有三个构造函数都使用的一个对象最终会有三个属性:<!-- Script provides the `snippet` object, see http://meta.stackexchange.com/a/242144/134069 -->
<script src="//tjcrowder.github.io/simple-snippets-console/snippet.js"></script>
,nameA
和nameB
。
同样,我不建议这样做,只是指出它是可能的,并且可以解决一些问题,虽然它不清楚它是否适合你的。