Rumah  >  Soal Jawab  >  teks badan

javascript - Warisan JS, bagaimana untuk mengelakkan situasi di mana atribut jenis objek prototaip kelas induk akan dipengaruhi oleh subkelas;

. 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梦2691 hari yang lalu877

membalas semua(4)saya akan balas

  • 扔个三星炸死你

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

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

    balas
    0
  • 伊谢尔伦

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

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

    balas
    0
  • 三叔

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

    Atribut bukan kaedah tidak disyorkan untuk ditetapkan pada prototaip

    balas
    0
  • 学习ing

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

    Apabila memulakan subkelaschild, tentukan atribut peribadi:

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

    balas
    0
  • Batalbalas