Si je comprends bien, object.hasOwnProperty()
devrait retourner false sur les propriétés héritées de la classe parente. Toutefois, le code suivant renvoie true sur les propriétés propres et héritées.Script de type: object.hasOwnProperty() indique true sur la propriété héritée. Pourquoi?
Est-ce que ma compréhension/code est incorrect ou est hasOwnPropery()
incorrect? Si c'est moi, comment distinguer les propriétés propres des propriétés héritées?
Modifier: J'ai ajouté mon cas d'utilisation à l'exemple de code.
Je m'attendrais à ce que le fromDb()
de l'enfant s'occupe seulement de ses propres propriétés, à la place, il substitue les propriétés définies par le fromDb()
du parent.
class Parent {
parentProp = '';
fromDb(row: {}) {
for (const key of Object.keys(row)) {
if (this.hasOwnProperty(key)) {
if (key === 'parentProp') {
// Do some required data cleansing
this[key] = row[key].toUpperCase()
} else {
this[key] = row[key];
}
}
};
return this;
}
}
class Child extends Parent {
childProp = '';
fromDb(row: {}) {
super.fromDb(row);
for (const key of Object.keys(row)) {
if (this.hasOwnProperty(key)) {
this[key] = row[key];
}
};
return this;
}
}
let row = {
parentProp: 'parent',
childProp: 'child',
}
let childObj = new Child().fromDb(row);
console.log(childObj);
Console:
Child:
childProp: "child"
parentProp: "parent"
J'ai modifié la question pour inclure mon cas d'utilisation. – passerby
J'ai ajouté quelques détails pour ce cas d'utilisation spécifique. Si vous avez besoin d'être plus sélectif, vous devrez créer une carte de propriétés pour que l'enfant regarde la carte, plutôt que ses propres clés (ie "si la propriété est dans ma carte, je la changerai, sinon je ne le ferai pas"). – Fenton
Il semble que la copie ait lieu dans les deux sens. Quand j'ajoute 'console.log (Object.keys (this))' au 'fromDb()' du Parent, il montre aussi les propriétés de l'Enfant lorsqu'il est appelé par 'super.fromDb (row)'. Je n'ai jamais réalisé cet effet du sucre syntaxique. Naive me ... – passerby