У меня есть метод, который позволит мне выбрать объект-прототип при создании нового объекта (скопированный с «Javascript: The Good Parts» книги):Javascript поведение прототипа
Object.create = function(o) {
var F = function() {};
F.prototype=o;
return new F();
}
Теперь говорят, у меня есть объект :
var car = {
model: "Nissan"
};
И создать новый объект на основе этого объекта, используя метод "Create":
var car1 = Object.create(car);
Затем я могу добавить свойство к машине, и оно будет динамически добавляться в car1 (динамическое прототипирование). Так, например:
car.year=2011; // Gets added to "car"...
alert(car1.year); // ... Is also avaialable to car1
Q1) Такое поведение указывает на то, что «год» был добавлен в прототип автомобиля, поэтому он доступен car1. Это верно? Если нет, то где добавляется «год» и почему он доступен как для «автомобилей», так и для «car1»?
Кроме того, за правило делегирования, если метод не может быть найден на объекте, он будет искать свой прототип, а затем проверять все прототипы вверх по цепочке до получения объекта 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 пример выше, он будет добавлен прототип автомобиля Тем не менее, когда я добавить свойство. Объект, он не добавляется к объекту своего прототипа? Если это не добавляются, чтобы объект-прототип, то почему он не доступен «автомобиль», в соответствии с правилом делегации?
почему это происходит?
Я думаю, что поведение связано с тем, что свойства созданы на прототипе, и если вы попытаетесь создать их из самого объекта, он выбрасывает неопределенные и каждый раз, когда вы создаете свойство через прототип, каждый элемент, созданный с помощью этого прототипа наследует его. –
Ваш Q2 начинается с неправильного: вы не добавили ничего в прототип 'car', вы добавили его в прототип' car1' (который, оказывается, «автомобиль») – searlea