多继承控制台输出

时间:2016-03-14 12:56:28

标签: javascript html5

我正在使用下面的代码。我的代码输出控制台出错了。现在我得到"这是一个B"但我在输出控制台上需要与构造函数相关的输出。喜欢"这是a"首先,"这是a"第二,"这是aC"第三个控制台。

libnetwork

1 个答案:

答案 0 :(得分:1)

所有三个构造函数中的

this引用同一个对象:new运算符创建的对象。那个对象只能有一个 name属性。所以你最后调用的构造函数将是#34; win"并且名称将由此分配。因此,您始终会看到B,因为即使使用new C,第一个C也会写入C,然后A会写入A(覆盖C),最后B写B(覆盖A)。

如果您希望与层次结构中每个级别相关的代码具有自己的name属性,那么您无法真正做到这一点,但是您可以通过让每个级别使用自己的属性来接近(例如,{{ 1}},nameAnameB)。您可以通过使用括号表示法和每个级别的所有代码共享的变量,以不需要您记住您编写代码的级别的方式执行此操作。

不推荐。无论您尝试解决的实际问题是什么,都可能是更好的解决方案。

但是,你可以这样做:



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;
&#13;
&#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>nameAnameB

同样,我不建议这样做,只是指出它是可能的,并且可以解决一些问题,虽然它不清楚它是否适合你的。