Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   Вызов глобального this (https://javascript.ru/forum/events/44361-vyzov-globalnogo.html)

ukhov 17.01.2014 00:07

Вызов глобального this
 
var obj = {
 'name': 'abc',
 'subobj': {
  'a': function() {
   alert(this.name); // abc
  }
 }
}

Как такое реализовать? Не через obj.name, а как-нибудь через this или что-то подобное.

cyber 17.01.2014 00:24

ukhov, оно?
'a': function() {
   alert(window.name); 
  }


а лучше прочитайте http://learn.javascript.ru/function-basics и разберитесь сами

ukhov 17.01.2014 15:58

так window.* - это внешние переменные, а мне нужно в этом объекте

cyber 17.01.2014 19:21

ukhov, хм, увидел, не сразу понял.
Можно через bind или call (apply), но лучше скажите зачем?
Если что бы не писать имя obj каждый раз то можно просто завести переменную self и записать тyда obj

ArtJS 18.01.2014 01:19

Цитата:

переменную self и записать тyда obj
А будет ли она видна из внутри функции вложенного объекта?
Я вот ранее с JS не сталкивался, думал ерундовая задачка, как два байта переслать, ан нет!
Уже пол часа ковыряю, тоже заинтересовало и что-то не удается достучаться из той функции к self

var obj = {
                name: 'abc',
                self: this,
                subobj : {
                    a: function() {
                        alert(self.name); // тут я пробовал разное даже поля прописывал в subobj но ничего не вышло
                    }
                }
            }

В условии сказано, что передовать в функцию аргумент нельзя, и как тогда?

kostyanet 18.01.2014 01:53

Покажите как вы хотели бы передать унутрнний контекст из одной проперти в другую без функции. Для прояснения разделим на две части.

var obj = {name: 'abc', self: this};

// тут может быть туева хуча кода и внезапно

obj.subobj : {a: function() {alert(self.name);}};


Я сам в JS слаб на оба полушария, но если разведка донесла правду, то объекты без конструктора суксь и мастдай. Я блин как осел мучился с этими идиотскими зисами, повелся, типа на "статику", а оказалось в "динамике" в стопицот раз все проще. Чего и вам желаю.

cyber 18.01.2014 03:23

ArtJS, что за наркомания?

var obj = {
 'name': 'abc',
 'subobj': {
  'a': function() {
   var self = obj;
   alert(self.name); // abc
  }
 }
}


или

var obj = {
 'name': 'abc',
 'subobj': {
  parent: obj
  'a': function() {
   alert(this.parent.name); // abc
  }
 }
}

ArtJS 18.01.2014 03:58

Про var self = obj; признаться недодумался, спасибо! Просто JS специфический язык, не похожий на классическое представление ООП.
А вот ваш второй пример ничего не выводит, в отличие от первого примера.
И кстати, тогда уж и просто
alert(obj.name);
прокатит.
Это повезло что мы объявили этот объект.
А если создавать их несколько с помощью конструктора еще не факт, что прокатит.

kostyanet 18.01.2014 06:10

Как можно не догадаться до хардкора в условиях профтыкания массивов в массив ? :)

danik.js 18.01.2014 07:14

Цитата:

Сообщение от ArtJS
Просто JS специфический язык, не похожий на классическое представление ООП.

А как в классическом ООП решается эта проблема?


Часовой пояс GMT +3, время: 20:46.