代码之家  ›  专栏  ›  技术社区  ›  david.schreiber

如何继承javascript中的私有成员?

  •  6
  • david.schreiber  · 技术社区  · 16 年前

    在javascript中,有没有一种方法可以将私有成员从基类继承到子类?

    我想实现这样的目标:

    function BaseClass() {
      var privateProperty = "private";
    
      this.publicProperty = "public";
    }
    
    SubClass.prototype = new BaseClass();
    SubClass.prototype.constructor = SubClass;
    
    function SubClass() {
      alert( this.publicProperty );   // This works perfectly well
    
      alert( this.privateProperty );  // This doesn't work, because the property is not inherited
    }
    

    我怎样才能实现一个类的仿真,就像其他OOP语言(例如C++)一样,我可以继承私有的(受保护的)属性?

    谢谢您, 戴维施雷伯

    4 回复  |  直到 11 年前
        1
  •  13
  •   Dau Gopi    11 年前

    使用 Douglas Crockfords power constructor pattern (链接到视频),您可以实现如下受保护变量:

    function baseclass(secret) {
        secret = secret || {};
        secret.privateProperty = "private";
        return {
            publicProperty: "public"
        };
    }
    
    function subclass() {
        var secret = {}, self = baseclass(secret);
        alert(self.publicProperty);
        alert(secret.privateProperty);
        return self;
    }
    

    注意:对于power constructor模式,您不使用 new . 相反,只要说 var new_object = subclass(); .

        2
  •  1
  •   Andris    16 年前

    马克你 私有的 带有某种标记(如前导下划线)的变量_ 这样你就知道它是一个私有变量(尽管从技术上讲它不是)

    this._privateProperty = "private";
    alert( this._privateProperty )
    
        3
  •  0
  •   James    16 年前

    这是不可能的。这并不是真正的私有财产,它只是一个正则变量,只在定义它的范围内可用。

        4
  •  0
  •   Daniel Rodriguez    16 年前

    这无法完成,但可以从类原型中删除该属性,使其不被继承:

    SubClass.prototype.privateProperty  = undefined;
    

    这样它就不会被继承,但您需要为基类中的每个“私有”属性都这样做。