Maison  >  Questions et réponses  >  le corps du texte

javascript - Héritage JS, comment éviter la situation où l'attribut de type d'objet du prototype de classe parent sera affecté par la sous-classe ;

parent est la classe parent, child hérite de parent, lorsque la valeur de sex de l'instance child est modifiée, cela entraînera le sex de parent et des autres instances de sous-classe à changer ;
Ce type d'attributs de type d'objet peut-il être placé uniquement dans le constructeur ? Ou est-il convenu que l'attribut d'objet dans le prototype ne peut pas être modifié pour éviter l'impact des instances de sous-classe sur la classe parent et les autres sous-classes ? Y a-t-il autre chose ?

    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 Il y a quelques jours834

répondre à tous(4)je répondrai

  • 扔个三星炸死你

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

    Cette méthode permet aux sous-classes et aux objets d'accéder au sexe. Si le sexe n'existe pas, une copie de la classe parent sex sera créée pour lui. Si elle existe, elle sera renvoyée directement.

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

    répondre
    0
  • 伊谢尔伦

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

    La sous-classe définit un attribut du même nom, remplaçant celui de la classe parent ?

    répondre
    0
  • 三叔

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

    Il n'est pas recommandé de définir les attributs non-méthodes sur le prototype

    répondre
    0
  • 学习ing

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

    Lors de l'initialisation de la sous-classechild, définissez les attributs privés :

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

    répondre
    0
  • Annulerrépondre