Инициализация свойства объекта
Я следил за Eloquent Javascript и наткнулся на этот кусок кода:
var protoRabbit = {
speak: function(line) {
console.log("The " + this.type + " rabbit says '" +
line + "'");
}
};
Исходя из фона в C/C++, этот синтаксис отбросил меня. Откуда появился тип недвижимости? Это добавляется в protoRabbit, когда мы запускаем protoRabbit.speak()? Заранее спасибо.
РЕДАКТИРОВАТЬ: Спасибо за ответы. Я прошу прощения, так как кажется, что я не очень ясно изложил свой вопрос. Что меня смущает, так это то, должно ли свойство 'type' существовать до того, как мы его инициализируем. Как в:
var protoRabbit = {type: "some value", speak: ... };
Это автоматически добавляется как свойство, когда мы инициализируем его? Если бы protoRabbit был const, это нарушило бы инициализацию const?
2 ответа
Что меня смущает, так это то, должно ли свойство 'type' существовать до того, как мы его инициализируем... Это автоматически добавляется как свойство, когда мы его инициализируем? Если бы protoRabbit был const, это нарушило бы инициализацию const?
Вы можете установить любой ключ на объекте в любое время, без предварительной инициализации. Является ли переменная const
не имеет значения, потому что объект ref не изменяется, сам объект мутирует на месте. Вы столкнетесь с проблемами, только если попытаетесь назначить другой объект protoRabbit
,
var protoRabbit = {
speak: ...
};
Это создает объект с одним свойством с именем speak
,
protoRabbit.type = "killer";
Это создает свойство на protoRabbit
называется type
, Это не существует до этой линии.
Переменные в JavaScript, в частности var
, разные. Их ссылка поднимается до верхней части лексической области, где они объявлены, чтобы более ранние ссылки не прерывались. let
не поднимается, и следует другой семантике области видимости.
Откуда появился тип недвижимости?
Нигде в этом коде. Если вы вызовете функцию, вы увидите, что она undefined
,
var protoRabbit = {
speak: function(line) {
console.log("The " + this.type + " rabbit says '" +
line + "'");
}
};
protoRabbit.speak("{line variable}");
Выкопав книгу. Похоже, это часть кода, о которой вы говорите:
var protoRabbit = { speak : function ( line ) { console.log (" The " + this . type + " rabbit says '" + line + " '") ; } }; var killerRabbit = Object.create(protoRabbit); killerRabbit.type = "killer"; killerRabbit.speak ("SKREEEE !") ; // → The killer rabbit says 'SKREEEE !'
Вы можете увидеть type
свойство, определенное на killerRabbit
возразите всего несколькими строками позже.