7

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

5 回答 5

13

使用Douglas Crockfords 幂构造函数模式(链接是视频),您可以实现这样的受保护变量:

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;
}

注意:使用幂构造函数模式,您不要使用new. 相反,只是说var new_object = subclass();

于 2009-11-28T22:52:47.837 回答
2

用某种标记标记你的私有变量,比如前导下划线 _ 这样你就知道它是一个私有变量(虽然从技术上讲它不是)

this._privateProperty = "private";
alert( this._privateProperty )
于 2009-11-28T22:31:12.687 回答
0

这是不可能的。这并不是真正的私有属性——它只是一个仅在定义它的范围内可用的常规变量。

于 2009-11-28T17:23:57.570 回答
0

这是无法做到的,但您可以从类原型中删除该属性,使其不被继承:

SubClass.prototype.privateProperty  = undefined;

这样它就不会被继承,但是您需要为基类中的每个“私有”属性执行此操作。

于 2009-11-28T17:27:27.720 回答
0

如果有人今天(2019 年 10 月)发现,仅供参考,我们可以使用 javascript 在 javascript 中实现私有属性WeakMap()

const _privateProperty = new WeakMap();

class BaseClass {
    constructor(){
        this.publicProperty = 'public';
       _privateProperty.set(this, 'private');
    }
}

module.exports = BaseClass;

继承基类

const BaseClass = require('./BaseClass')

class ChildClass extends BaseClass{
   constructor(){
      super()
   }
}

这样,您的子类将从 BaseClass 继承所有公共属性,但私有属性除外。

现在,我不确定是否应该采用这种方法,但您可以通过您的子类从父类读取私有属性:

const _privateProperty = new WeakMap();

class BaseClass {
    constructor(){
        this.publicProperty = 'public';
       _privateProperty.set(this, 'private');
    }
    //Public method
    readProperties(){
      const property.private = _privateProperty.get(this);
      return property;
   }
}

module.exports = BaseClass;

儿童班

const BaseClass = require('./BaseClass')

class ChildClass extends BaseClass{
   constructor(){
      super()
   }
   //Public Method
   showProperties(){
      super.readProperties().private
   }
}

const properties = new ChildClass()
properties.showProperties()

于 2019-10-01T10:29:00.107 回答