Как объект Javascript может ссылаться на значения сам по себе?
Допустим, у меня есть следующий JavaScript:
var obj = {
key1 : "it ",
key2 : key1 + " works!"
};
alert(obj.key2);
Эта ошибка с "ключом1 не определена". я пытался
this.key1
this[key1]
obj.key1
obj[key1]
this["key1"]
obj["key1"]
и они никогда не кажутся определенными.
Как я могу получить key2 для ссылки на значение key1?
8 ответов
Может быть, вы можете подумать об удалении атрибута функции. Я имею в виду что-то вроде этого:
var obj = {
key1 : "it ",
key2 : function() {return this.key1 + " works!";}
};
alert(obj.key2());
Это может быть достигнуто с помощью функции конструктора вместо литерала
var o = new function() {
this.foo = "it";
this.bar = this.foo + " works"
}
alert(o.bar)
Вы не можете ссылаться на свойство объекта до того, как инициализируете этот объект; использовать внешнюю переменную.
var key1 = "it";
var obj = {
key1 : key1,
key2 : key1 + " works!"
};
Кроме того, это не "объект JSON"; это объект Javascript. JSON - это метод представления объекта в виде строки (допустимый код Javascript).
Одной из альтернатив будет использование методов получения / установки.
Например, если вам нужно только прочитать рассчитанное значение:
var book = {}
Object.defineProperties(book,{
key1: { value: "it", enumerable: true },
key2: {
enumerable: true,
get: function(){
return this.key1 + " works!";
}
}
});
console.log(book.key2); //prints "it works!"
Приведенный выше код, тем не менее, не позволит вам определить другое значение для key2.
Таким образом, все становится немного сложнее, если вы хотите также переопределить значение key2. Это всегда будет расчетное значение. Скорее всего, это то, что вы хотите.
Однако, если вы хотите переопределить значение ключа key2, вам понадобится место для кэширования его значения независимо от расчета.
Примерно так:
var book = { _key2: " works!" }
Object.defineProperties(book,{
key1: { value: "it", enumerable: true},
_key2: { enumerable: false},
key2: {
enumerable: true,
get: function(){
return this.key1 + this._key2;
},
set: function(newValue){
this._key2 = newValue;
}
}
});
console.log(book.key2); //it works!
book.key2 = " doesn't work!";
console.log(book.key2); //it doesn't work!
for(var key in book){
//prints both key1 and key2, but not _key2
console.log(key + ":" + book[key]);
}
Еще одна интересная альтернатива - использовать самоинициализирующийся объект:
var obj = ({
x: "it",
init: function(){
this.y = this.x + " works!";
return this;
}
}).init();
console.log(obj.y); //it works!
Потому что утверждение, определяющее obj
не закончил, key1
еще не существует Рассмотрим это решение:
var obj = { key1: "it" };
obj.key2 = obj.key1 + ' ' + 'works!';
// obj.key2 is now 'it works!'
Это не объект JSON, это объект Javascript, созданный с помощью литеральной нотации объекта. (JSON - это текстовая нотация для обмена данными (подробнее). Если вы имеете дело с исходным кодом JavaScript и не имеете дело со строкой, вы не имеете дело с JSON.)
Внутри инициализатора объекта нет способа ссылаться на другой ключ инициализируемого объекта, потому что нет способа получить ссылку на создаваемый объект, пока инициализатор не завершится. (Там нет ключевого слова сродни this
или что-то для этой ситуации.)
Вы также можете сослаться на obj
когда вы находитесь внутри функции вместо this
,
var obj = {
key1: "it",
key2: function(){return obj.key1 + " works!"}
};
alert(obj.key2());
Это не JSON. JSON был разработан, чтобы быть простым; разрешить произвольные выражения не просто.
В полном JavaScript, я не думаю, что вы можете сделать это напрямую. Вы не можете ссылаться на this
пока объект не называется obj
полностью построен. Так что вам нужен обходной путь, чтобы кто-то с большим количеством JavaScript-фу, чем я предоставлю.