Вызов глобального this
var obj = { 'name': 'abc', 'subobj': { 'a': function() { alert(this.name); // abc } } } Как такое реализовать? Не через obj.name, а как-нибудь через this или что-то подобное. |
ukhov, оно?
'a': function() { alert(window.name); } а лучше прочитайте http://learn.javascript.ru/function-basics и разберитесь сами |
так window.* - это внешние переменные, а мне нужно в этом объекте
|
ukhov, хм, увидел, не сразу понял.
Можно через bind или call (apply), но лучше скажите зачем? Если что бы не писать имя obj каждый раз то можно просто завести переменную self и записать тyда obj |
Цитата:
Я вот ранее с JS не сталкивался, думал ерундовая задачка, как два байта переслать, ан нет! Уже пол часа ковыряю, тоже заинтересовало и что-то не удается достучаться из той функции к self var obj = { name: 'abc', self: this, subobj : { a: function() { alert(self.name); // тут я пробовал разное даже поля прописывал в subobj но ничего не вышло } } } В условии сказано, что передовать в функцию аргумент нельзя, и как тогда? |
Покажите как вы хотели бы передать унутрнний контекст из одной проперти в другую без функции. Для прояснения разделим на две части.
var obj = {name: 'abc', self: this}; // тут может быть туева хуча кода и внезапно obj.subobj : {a: function() {alert(self.name);}}; Я сам в JS слаб на оба полушария, но если разведка донесла правду, то объекты без конструктора суксь и мастдай. Я блин как осел мучился с этими идиотскими зисами, повелся, типа на "статику", а оказалось в "динамике" в стопицот раз все проще. Чего и вам желаю. |
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 } } } |
Про var self = obj; признаться недодумался, спасибо! Просто JS специфический язык, не похожий на классическое представление ООП.
А вот ваш второй пример ничего не выводит, в отличие от первого примера. И кстати, тогда уж и просто alert(obj.name);прокатит. Это повезло что мы объявили этот объект. А если создавать их несколько с помощью конструктора еще не факт, что прокатит. |
Как можно не догадаться до хардкора в условиях профтыкания массивов в массив ? :)
|
Цитата:
|
Цитата:
Например для ЯП Java (не Script) если это нестатические классы то можно наваять что-то в стиле такого: public class MyObj { private String name = "abc"; public class SubObj { private int x = 12345; void printName() { System.out.println(name);//спокойно обратимся к полю name внешнего класса. } } } Ну а использование такого как-то так будет: MyObj.SubObj obj = new MyObj().new SubObj(); obj.printName(); Ладно, это конечно оффтоп :) Просто представление в JS объектов в виде массивов накладывает свои особенности, сразу непривычно |
Цитата:
function MyObj() { this.name = "abc"; } MyObj.SubObj = function(parent) { this.parent = parent; this.x = 12345; } MyObj.SubObj.prototype.printName = function() { alert(this.parent.name); } new MyObj.SubObj(new MyObj()).printName(); |
Часовой пояс GMT +3, время: 14:11. |