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 ;
过去多啦不再A梦
过去多啦不再A梦 2017-06-30 09:59:00
0
4
907

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梦

répondre à tous(4)
扔个三星炸死你

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

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

三叔

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

学习ing

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

function child() {
    this.sex = '';
}
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal