Понимание прототипного наследования
var Object1 = {};
var Object2 = new Object();
var Object3 = Object.create({});
Когда я проверяю, равен ли прототип Object.prototype
:
Первые два возвращение true
в то время как третий возвращается false
,
Почему это происходит?
Object.getPrototypeOf(Object1)===Object.prototype //true
Object.getPrototypeOf(Object2)===Object.prototype //true
Object.getPrototypeOf(Object3)===Object.prototype //false
2 ответа
Решение
Просто потому, что если вы посмотрите на Object.create() в документации, вы увидите, что этот метод:
создает новый объект с указанным объектом-прототипом и свойствами.
И если вы называете это с:
Object.create({})
Вы передаете не прототип, а пустой объект без свойств.
Итак, как указано в комментариях, вы должны назвать это так:
Object.create(Object.prototype)
Метод Object.create() создает новый объект с указанным объектом-прототипом и свойствами.
За кулисами он делает следующее:
Object.create = (function() {
var Temp = function() {};
return function (prototype) {
if (arguments.length > 1) {
throw Error('Second argument not supported');
}
if (typeof prototype != 'object') {
throw TypeError('Argument must be an object');
}
Temp.prototype = prototype;
var result = new Temp();
Temp.prototype = null;
return result;
};
})();
Таким образом, правильное использование будет:
var Object3 = Object.create(Object.prototype);
Или, если вы хотите, чтобы ваш пример работал:
Object.getPrototypeOf(Object.getPrototypeOf(Object3)) === Object.prototype // true
Здесь вступает в действие цепочка прототипов:
console.dir(Object3)
-> __proto__: Object (=== Your Object Literal)
-> __proto__: Object (=== Object.prototype)