Говорят, что все объекты Javascript имеют свойство prototype, но я вижу только foo.prototype, если foo является функцией?
Часто говорят, что каждый объект Javascript имеет свойство prototype
, но я считаю, что foo.prototype
имеет значение, только если foo
является функцией.
В Chrome и Firefox obj.__proto__
имеет значение - это указанное свойство prototype
? Но на IE 9 это не сработает (может ли какой-то способ это сделать?), И я подумал о свойстве prototype
, что означает, что obj.prototype
должен работать?
Я понимаю, что Object.getPrototypeOf(obj)
похоже, показывает это свойство prototype
, но зачем нужен специальный метод для его получения? Почему не просто как person.name
, который должен получить свойство name
объекта person
?
Обновление:, кстати, obj.constructor.prototype
выглядит как иногда, но иногда это не так, как в следующем коде, выполненном с использованием прототипального наследования без конструктора: (этот метод содержится в книге "Образцы дизайна Javascript" от Harmes and Diaz от Apress 2008, стр. 46)
var Person = {
name: 'default value',
getName: function() {
return this.name;
}
}
var reader = clone(Person);
console.log(reader.getName());
reader.name = "Ang Lee";
console.log(reader.getName());
function clone(obj) {
function F() {};
F.prototype = obj;
return new F;
}
console.log("the prototype of reader is", Object.getPrototypeOf(reader));
console.log(Object.getPrototypeOf(reader) === reader.constructor.prototype);
console.log(Object.getPrototypeOf(reader) == reader.constructor.prototype);
console.log(Object.getPrototypeOf(reader) === reader.__proto__);
console.log(Object.getPrototypeOf(reader) == reader.__proto__);
результат будет показывать false, false, true, true для последних 4 строк.
Ответы
Ответ 1
Каждый объект JavaScript имеет внутреннее свойство "prototype", часто называемое [[prototype]], которое указывает на объект, из которого он непосредственно наследуется. Это отображается в FF и Chrome нестандартным свойством __proto__
. Object.getPrototypeOf
является геттером для этого внутреннего свойства.
Каждая функция JavaScript [object] имеет свойство prototype
, которое инициализируется [почти] пустым объектом. Когда вы создаете новый экземпляр этой функции, вызывая ее как конструктор, [[prototype]] этого нового объекта укажет на объект конструктора prototype
.
Если вы получаете [[prototype]] функции (каждая функция является объектом, поэтому она имеет один), это приведет к тому, что объект Function.prototype
, из которого функции наследуют свои методы (например, bind, call, apply и т.д). См. Также Почему многократно запущен прототип?.
Ответ 2
Это constructor
каждого объекта, имеющего prototype
. Поэтому для некоторых foo
, bar
или foobar
:
var foo = {};
console.log(foo.constructor.prototype); //=> Object
var bar = 5;
console.log(bar.constructor.prototype); //=> Number
function Foobar(){}
var foobar = new Foobar; //Foobar used a constructor
console.log(foobar.constructor.prototype); //=> Foobar