javascript - Warisan JS, bagaimana untuk mengelakkan situasi di mana atribut jenis objek prototaip kelas induk akan dipengaruhi oleh subkelas;
过去多啦不再A梦
过去多啦不再A梦 2017-06-30 09:59:00
0
4
914
. untuk menukar;

Bolehkah atribut jenis objek ini diletakkan hanya dalam pembina atau adakah dipersetujui bahawa atribut objek dalam prototaip tidak dibenarkan diubah suai untuk mengelakkan kesan contoh subkelas pada kelas induk dan subkelas lain? Adakah terdapat apa-apa lagi penyelesaian?

    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梦

membalas semua(4)
扔个三星炸死你

Kaedah ini membolehkan subkelas dan objek mengakses seks Jika seks tidak wujud, salinan jantina kelas ibu bapa akan dibuat untuknya.

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);
伊谢尔伦

Subkelas mentakrifkan atribut dengan nama yang sama, mengatasi kelas induk?

三叔

Atribut bukan kaedah tidak disyorkan untuk ditetapkan pada prototaip

学习ing

Apabila memulakan subkelaschild, tentukan atribut peribadi:

function child() {
    this.sex = '';
}
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan