Prototypal Inheritance - Странно поведение в едно от демата


1

Здравейте,

имам следното питане по следното демо:

var animal = {

makeNoise: function () {
console.log('The ' + this.type + ' makes noise "' + this.noise + '"');
}
};


var dog = (function (parent) {
var dog = Object.defineProperties(parent, {
type: {
value: 'dog'
},
noise: {
value: 'djaf'
},
bark: {
value: function (){
console.log('Bark, Bark');
}
}
});
return dog;
}(animal));

dog.makeNoise(); //The dog makes noise "djaf"
animal.makeNoise(); //The dog makes noise "djaf"
console.log(animal.type); //dog

От резултатите в последните два реда си вадя извода, че defineProperties на наследника, променя property-тата на родителя. Нещо бъркам или...?




Отговори



3

Изобщо не бъркаш:

The Object.defineProperties() method defines new or modifies existing properties directly on an object, returning the object.

Като подаваш parent (което в случая е animal) на функцията Object.defineProperties, ти реално си работиш върху обекта animal. Също така, ако тестваш най-долу например напишеш dog.test = 'blabla'; и после console.log(animal.test) връща 'blabla'.


от topalkata (6442 точки)


1
За да направиш Prototypal Inheritance трябва първо да създадеш нов обект с Object.create(parent); и после да добавяш допълнителна функционалност към новият обект. В примрът не се прави наследник, тъй като Object.defineProperties(); работи по даденият обект, без да създава нов. dog и аnimal реферират един и същ обект. :D

от Pariador (60 точки)