javascript - JS继承,如何避免父类原型的object类型属性会受子类影响的情况;
过去多啦不再A梦
过去多啦不再A梦 2017-06-30 09:59:00
0
4
870

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梦

全部回复(4)
扔个三星炸死你

这个方式可以让子类和对象访问 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);
伊谢尔伦

子类定义一个同名属性, 覆盖父类的?

三叔

非方法的属性不推荐设置在原型上

学习ing

在初始化子类child时候,定义私有属性:

function child() {
    this.sex = '';
}
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!