继承和模块模式错误的行为?

时间:2014-04-11 17:24:18

标签: javascript inheritance private

我正在使用 Bergi 回答这个问题:Inheritance and module pattern

我修改了一些代码,将_a_b添加为私有变量来测试它们......我发现了一个错误的行为,我期待......

Parent = (function (a) {
    var _a = null;
    var _b = "b";

    // constructor
    function construct (a) {
        console.log("Parent constructor - " + a);
        _a = a;
    };

    // public functions
    construct.prototype.getA = function () {
        console.log("Parent: " + _a);
    };
    construct.prototype.getB = function () {
        console.log("Parent: " + _b);
    };

    return construct;
})();

Child = (function () {
    // constructor
    function construct(b) {
        console.log("Child constructor - " + b);
        //Parent.apply(this, arguments);
        Parent.call(this, "A");
        _b = b;
    }

    // make the prototype object inherit from the Parent's one
    construct.prototype = Object.create(Parent.prototype);
    // public functions
    construct.prototype.getB = function() {
        console.log("Child: " + _b);
    };

    return construct;
})();

p = new Parent("a");
c = new Child("B");

c.getA();   // Parent: A -- nice!
c.getB();   // Parent: B -- nice!

p.getA();   // Parent: A -- wrong! "a" expected! (desired)
p.getB();   // Parent: b -- right

有没有办法达到预期的行为。像java这样的行为?也许,如果你更改Child._a值,那么不要像这个例子那样影响Parent._a。

1 个答案:

答案 0 :(得分:1)

IIFE在Parent的声明上执行一次,而不是每次创建实例时都会为所有实例共享_a(尝试改变数组而不是分配基元)。在Child中没有_b,因此您创建了一个全局_b。

创建特定于实例的私有的唯一方法是在构造函数中将它们与需要访问它们的特权函数一起使用。它们将通过Parent.call(this,args)继承。

因为特权函数不能访问私有函数,除非它们在构造函数体中因此不能在原型上,所以你必须牺牲性能,例如特定的私有。

有关构造函数,原型和受保护模式的更多信息,请参见此处。Prototypical inheritance - writing up