Jump to content
  • 0

Object literal syntax


paska
 Share

Question

задача:

есть объект, в котором должны быть статические (не будут изменяться) и динамические (будут изменяться) свойства.

испльзуя Object literal syntax для объекта статич. свойства я объявляю как свойства, а динамические каждый раз перезаписываю в методе init. вот так:

obj = {
stat1 : 'some value',
stat2 : obj.stat1 + ' will be here',
init : function(){
// небходимо использовать некоторые из ранее созданных свойств этого объекта (stat1, stat2,...)
dynamic_prop = stat1 + stat2;
}
}


obj.init();

но при попытке использования stat1 когда я объявляю stat2 приводит к ошибке: "obj is undefinite". то же и с init() методом.

чувствую, что-то не так, но не врубаюсь что. посему два вопроса:

1. почему такая конструкция не работает (в теории);

2. как правильно осуществить такую задумку.

заранее всем спс.

Link to comment
Share on other sites

17 answers to this question

Recommended Posts

  • 0

Потому что зона видимости переменных внутри функции заканчивается на этой функции. Но, решение есть

this вернет ссылку на obj.

dynamic_prop = this.stat1 + this.stat2; будет работать как надо.

stat2 : obj.stat1 + ' will be here' не будет работать, так как свойство объекта ничего не знает про переменную obj, да и this.stat1 тоже не будет еще существовать на момент вызова.

Link to comment
Share on other sites

  • 0

хм, а теперь работает вот так

obj = {

stat1 : 'some value',

stat2 : ' will be here',

init : function(){

// небходимо использовать некоторые из ранее созданных свойств этого объекта (stat1, stat2,...)

dynamic_prop = obj.stat1 + obj.stat2;

alert(dynamic_prop);

}

}

obj.init();

если в методе использовать this - то тоже работает. запутался....

в общем получается, что метод может ссылаться (если использовать literal syntax) на объект, к которому он принадлежит, а свойство - нет?

Link to comment
Share on other sites

  • 0

s0rr0w

Вот смотри, такая штука выводит undefined will be here. Почему? Ведь this ссылается на наш объект, а разве нет? Почему? this.stat1.

И какой же тогда выход?

	<script type="text/javascript">
obj = {
stat1 : 'some value',
stat2 : this.stat1 + ' will be here',

}
alert(obj.stat2)

</script>

Link to comment
Share on other sites

  • 0

"В отличие от PHP, Java, C++ и т.п, значение this в javascript не привязывается статически ни к какому объекту, а зависит от контекста вызова.

Разберем все 4 возможных случая..." (С) javascript.ru

http://javascript.ru/tutorial/object/thiskeyword

получается - только ф-ия / метод может использовать this.

Link to comment
Share on other sites

  • 0
s0rr0w

Вот смотри, такая штука выводит undefined will be here. Почему? Ведь this ссылается на наш объект, а разве нет? Почему? this.stat1.

И какой же тогда выход?

	<script type="text/javascript">
obj = {
stat1 : 'some value',
stat2 : this.stat1 + ' will be here',

}
alert(obj.stat2)

</script>

На момент создания stat2 нет еще у объекта свойства stat1. Сначала парсер готовит все переменные, вычисляет их значения, а потом уже присваивает объекту свойства и их значения.

Это все равно что приготовить яйца, сковородку, соль, плиту, а потом уже жарить яичницу.

Link to comment
Share on other sites

  • 0
На момент создания stat2 нет еще у объекта свойства stat1. Сначала парсер готовит все переменные, вычисляет их значения, а потом уже присваивает объекту свойства и их значения.

Это все равно что приготовить яйца, сковородку, соль, плиту, а потом уже жарить яичницу.

Хорошо, а тогда почему к методам это не относиться?

Link to comment
Share on other sites

  • 0
Хорошо, а тогда почему к методам это не относиться?

Относится. Просто вызов метода идет на тот момент, когда объект уже создан и все свойства присвоены.

Тогда ещё вопрос.

А почему в случае с конструктором это прокатывает?

Последовательное исполнение инструкций потому что.

Link to comment
Share on other sites

  • 0
Относится. Просто вызов метода идет на тот момент, когда объект уже создан и все свойства присвоены.

Как же уже создан? Ведь мы так же как и свойства, пишем методы вместе с ними? Чем методы заслужили такую привилегию?

Последовательное исполнение инструкций потому что.

Т.е. выходит, что на момент создания this.stat2 - this.stat1 уже создано? И почему это отличается от обычного объекта?

function Obj() {

this.stat1 = "some value";

this.stat2 = this.stat1 + " will be here";

Link to comment
Share on other sites

  • 0
Как же уже создан? Ведь мы так же как и свойства, пишем методы вместе с ними? Чем методы заслужили такую привилегию?

Ну ты же метод вызываешь после создания объекта, а не во время создания.

Т.е. выходит, что на момент создания this.stat2 - this.stat1 уже создано? И почему это отличается от обычного объекта?

function Obj() {

this.stat1 = "some value";

this.stat2 = this.stat1 + " will be here";

Не понял вопроса

Link to comment
Share on other sites

  • 0
function Obj() {

this.stat1 = "some value";

this.stat2 = this.stat1 + " will be here";

Когда мы создаем функцию, то в ней есть контекст выполнения (this). А когда мы создаем объект-литерал (JSON), то там нет никакого контекста. В методах же контекст всегда есть т.к. создается экземпляр функции (Function). Хз понятно ли объяснил...

Поэтому:

var O = {
x: this, // undefined

init: function() {
var y = this;
alert(x);
alert(y); // Object (O)
}
}

Короче this работает только внутри функции.

P.S. Чтобы правильно работала функция топикстартера ее надо переписать, создав контекст при помощи замыкания:

obj = (function() {
var stat1 = 'some value',
stat2 = stat1 + ' will be here';

return {
init: function() {
var dynamic_prop = stat1 + ' ' + stat2;
alert(dynamic_prop);
}
}
}());

obj.init();

Link to comment
Share on other sites

  • 0

1)

Ну ты же метод вызываешь после создания объекта, а не во время создания.

Да, но я и НЕ метод тоже вызываю После создания объекта.

alert(obj.stat2);

2)

Не понял вопроса

Если брать функцию конструктор, и при вызове alert(obj.stat2); мне выдадут следующий результат: "some value will be here". Почему? Ведь когда я вызываю простую функцию, то мне выдают undefined will be here

function Obj() {
this.stat1 =;
this.stat2 = this.stat1 + " will be here";
this.init = function (){
dynamic_prop = this.stat2;
alert(dynamic_prop);
}
}

3)

Когда мы создаем функцию, то в ней есть контекст выполнения (this)

Что такое контекст выполнения?

Link to comment
Share on other sites

  • 0
Да, но я и НЕ метод тоже вызываю После создания объекта.

alert(obj.stat2);

Нет, это ты значение переменной берешь. Вызов был бы obj.stat2();

Если брать функцию конструктор, и при вызове alert(obj.stat2); мне выдадут следующий результат: "some value will be here". Почему?

Потому что на момент присвоения в приведенном коде, переменная stat1 существует у объекта. А при создании { stat1: "some" } этой переменной у объекта нет ровно до тех пор, пока не будет присвоен готовый объект переменной.

Что такое контекст выполнения?

Это долго пояснять. Поищи в инете.

Edited by s0rr0w
Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue. See more about our Guidelines and Privacy Policy