Говорят, что все объекты 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