首頁  >  問答  >  主體

javascript - JS繼承,如何避免父類別原型的object型別屬性會受子類別影響的情況;

parent為父類,child繼承parent,當修改child實例的sex的值時,會引起parent其他子類別實例sex的變更;
這類object類型的屬性是否只能放在建構函式內,或約定好不允許修改prototype中的object屬性,來避免子類別實例對父類別和其他子類別的影響;
有沒有其他的解決方案?

    function extend(p, c) {
        var f = function () {};
        f.prototype = p.prototype;
        c.prototype = new f();
        c.prototype.constructor = c;
    }
    function parent() {}
    parent.prototype.aaa = 123;
    parent.prototype.sex = ['男', '女'];

    function child() {}
    extend(parent, child);
    c1 = new child();
    c2 = new child();
    console.log('设置实例c1之前,父类的sex值:',parent.prototype.sex);
    console.log('设置实例c1之前,实例c2的sex值:',c2.sex);
    c1.sex.push('其他');
    console.log('设置实例c1之后,父类的sex值:',parent.prototype.sex);
    console.log('设置实例c1之后,实例c2的sex值:',c2.sex);

#
过去多啦不再A梦过去多啦不再A梦2641 天前833

全部回覆(4)我來回復

  • 扔个三星炸死你

    扔个三星炸死你2017-06-30 10:01:00

    這個方式可以讓子類別和物件存取 sex 的時候,如果 sex 不存在則為其建立一個父類別 sex 的副本,存在則直接回傳。

    function extend(p, c) {
        var f = function() {};
        f.prototype = p.prototype;
        c.prototype = new f();
        c.prototype.constructor = c;
    }
    
    function parent() {}
    parent.sex = ['男', '女'];
    parent.prototype.aaa = 123;
    Object.defineProperty(parent.prototype, 'sex', {
      configurable: true,
      enumerable: true,
      get: function () {
        if (this === parent || this === parent.prototype) {
          return parent.sex;
        }
    
        if (!this.hasOwnProperty('sex')) {
          Object.defineProperty(this, 'sex', {
            value: parent.sex.slice(),
            configurable: true,
            enumerable: true,
            writable: true
          });
        }
        return this.sex
      },
      set: function (value) {
        if (this === parent || this === parent.prototype) {
          parent.sex = value;
        } else if (!this.hasOwnProperty('sex')) {
          Object.defineProperty(this, 'sex', {
            value: value,
            configurable: true,
            enumerable: true,
            writable: true
          });
        } else {
          this.sex = value;
        }
      }
    });
    
    function child() {}
    extend(parent, child);
    var c1 = new child();
    var c2 = new child();
    var p1 = new parent();
    console.log('设置实例c1之前,父类的sex值:', parent.prototype.sex);
    console.log('设置实例c1之前,实例p1的sex值:', p1.sex);
    console.log('设置实例c1之前,实例c2的sex值:', c2.sex);
    c1.sex.push('其他');
    console.log('设置实例c1之后,父类的sex值:', parent.prototype.sex);
    console.log('设置实例c1之后,实例p1的sex值:', p1.sex);
    console.log('设置实例c1之后,实例c1的sex值:', c1.sex);
    console.log('设置实例c1之后,实例c2的sex值:', c2.sex);

    回覆
    0
  • 伊谢尔伦

    伊谢尔伦2017-06-30 10:01:00

    子類別定義一個同名屬性, 覆蓋父類別的?

    回覆
    0
  • 三叔

    三叔2017-06-30 10:01:00

    非方法的屬性不建議設定在原型上

    回覆
    0
  • 学习ing

    学习ing2017-06-30 10:01:00

    在初始化子類別child時候,定義私有屬性:

    function child() {
        this.sex = '';
    }

    回覆
    0
  • 取消回覆