У меня есть метод, который позволит мне выбрать объект-прототип при создании нового объекта (скопировано из книги "Javascript: The Good Parts"):
Object.create = function(o) {
var F = function() {};
F.prototype=o;
return new F();
}
Теперь скажем, у меня есть объект:
var car = {
model: "Nissan"
};
И я создаю новый объект на основе этого объекта, используя метод «Создать»:
var car1 = Object.create(car);
Затем я могу добавить свойство к car, и оно будет динамически добавлено к car1 (динамическое прототипирование). Итак, например:
car.year=2011; // Gets added to "car"...
alert(car1.year); // ... Is also avaialable to car1
Q1) Такое поведение указывает на то, что "год" был добавлен к прототипу автомобиля, поэтому он доступен для car1. Это верно? Если нет, то куда добавляется «год» и почему он доступен как для «автомобиля», так и для «автомобиля1»?
Кроме того, согласно правилу делегирования, если метод не может быть найден для объекта, он будет искать его прототип, а затем проверять все прототипы вверх по цепочке, пока не дойдет до Object.prototype. Итак, теперь, если я наберу что-то вроде этого:
Object.prototype.originCountry = "Japan";
alert(car.originCountry); // Outputs Japan
alert(car1.originCountry); // Outputs Japan
Все идет нормально; однако, если я это сделаю:
Object.carColor= "White";
alert(car.carColor); // Error!
Q2) Когда я добавляю свойство к "автомобилю" (см. пример car.year выше, оно добавляется к прототипу автомобиля. Однако, когда я добавляю свойство к объекту, оно не получает добавлен в прототип объекта? Если он добавляется в прототип объекта, то почему он недоступен для «автомобиля» в соответствии с правилом делегирования?
Почему это происходит?
car.year = 2011
теперь эквивалентно выражениюcar1.prototype.year = 2011
, посколькуcar1.prototype
есть не что иное, какcar
. 26.04.2012constructor
, который в новом экземпляре вернет объект сcar
в качестве прототипа. 26.04.2012o
, а неo.prototype
. Это означает car1.prototype === car и НЕ car1.prototype === car.prototype 26.04.2012car1
нет собственностиprototype
. Это внутренний указатель прототипаcar1
(где свойства просматриваются, если они не найдены непосредственно вcar1
), который указывает наcar
, поскольку он был установлен как свойство конструктора (F
)prototype
. 27.04.2012