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
801

parentest la classe parent,childhérite deparent, lorsque la valeur desexde l'instancechildest modifiée, cela entraînera lesexdeparentet desautres 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
          À propos de nous Clause de non-responsabilité Sitemap
          Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!