Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 18.09.2009, 16:20
Новичок на форуме
Отправить личное сообщение для sig_al Посмотреть профиль Найти все сообщения от sig_al
 
Регистрация: 12.07.2009
Сообщений: 3

Возможна ли конструкция вида this.this.property?
Описываю объект:
var newObj = function(){
  this.property = 'prop1';
  this.method = func1;
}

function func1(){
  var result = func2();
}

function func2(){
  this.property = 'PROP1';
}

Насколько я понимаю оператор this в функции func2() уже указывает не на newObj , а на func1().
А как мне получить ссылку на newObj находясь в func2()?

Последний раз редактировалось sig_al, 18.09.2009 в 16:33.
Ответить с цитированием
  #2 (permalink)  
Старый 18.09.2009, 16:44
Отправить личное сообщение для Octane Посмотреть профиль Найти все сообщения от Octane  
Регистрация: 10.07.2008
Сообщений: 3,873

Из вашего примера не понятно, на что будет указывает this, если newObj будет использоваться как функция, то this будет ссылкой на window.

function F() {
	this.test1 = function() {
		alert(this.constructor === F);
	};
}
F.prototype.test2 = function() {
	alert(this.constructor === F);
};

var a = new F;
a.test1();
a.test2();


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

function F() {}
F.prototype = {
    test: function() {
        alert(this.constructor === F);
    }
};

var a = new F;
a.test();

Последний раз редактировалось Octane, 18.09.2009 в 16:49.
Ответить с цитированием
  #3 (permalink)  
Старый 18.09.2009, 18:09
Новичок на форуме
Отправить личное сообщение для sig_al Посмотреть профиль Найти все сообщения от sig_al
 
Регистрация: 12.07.2009
Сообщений: 3

Т.е., если я правильно понял (немного запутано написано) необходимо определить func2() как метод newObj и из func1() вызывать уже этот метод.
Попробовал. Всё работает(свойство property изменилось). Код получился вот таким:
var newObj = function(){
  this.property = 'prop1';
  this.method = func1;
  this.method2 = func2;
}
 
function func1(){
  var result = this.method2();
}
 
function func2(){
  this.property = 'PROP1';
}
Ответить с цитированием
  #4 (permalink)  
Старый 18.09.2009, 23:55
Профессор
Отправить личное сообщение для Dmitry A. Soshnikov Посмотреть профиль Найти все сообщения от Dmitry A. Soshnikov
 
Регистрация: 25.02.2008
Сообщений: 707

Сообщение от sig_al
Описываю объект:
Сообщение от sig_al
var newObj = function(){ ... }
Хоть это и объект (функции - тоже объекты), но здесь Вы описывается конструктор объектов. И этот конструктор уже будет порождать Ваши объекты. При этом, this внутри этого конструктора будет ссылаться на создаваемый объект.

А зачем Вы описываете методы отдельно и потом присваиваете ссылки на них this-методам? В данном случае, можно сразу описать this-методы, без промежуточных описаний отдельных независимых (глобальных) функций.

var newObjConstructor = function () {
  this.property = 'prop1';
  this.method1 = function () {
    var result = this.method2();
  };
  this.method2 = function () {
    this.property = 'PROP1';
  };
};


А это уже объект, порождённый Вашим конструктором:

var newObj = newObjConstructor();
newObj.method1();
newObj.method2();


Но лучше описывать методы в прототипе, так будет использована одна копия метода на все объекты, порождаемые от конструктора (в случае же, когда Вы описываете методы в самом конструкторе, каждый объект будет иметь свой собственный метод, что повлечёт увеличение расхода памяти):

var newObjConstructor = function () {
  this.property = 'prop1';
}

newObjConstructor.prototype.method1 = function () {
  var result = this.method2();
};
newObjConstructor.prototype.method2 = function () {
   this.property = 'PROP1';
};

var newObj1 = new newObjConstructor();
var newObj2 = new newObjConstructor();
alert(newObj1.method1 === newObj2.method1); // true
__________________
Тонкости ECMAScript
Ответить с цитированием
  #5 (permalink)  
Старый 19.09.2009, 16:52
Аватар для Riim
Рассеянный профессор
Отправить личное сообщение для Riim Посмотреть профиль Найти все сообщения от Riim
 
Регистрация: 06.04.2009
Сообщений: 2,379

Сообщение от Dmitry A. Soshnikov
А зачем Вы описываете методы отдельно и потом присваиваете ссылки на них this-методам?
Функции будут создаваться для каждого экземпляра, зачем засорять память одинаковыми функциями? Я в таких случаях пишу так:
var MyClass = (function(methods) {
	return function() {
		Object.extend(this, methods);
		//
	};
})({
	method1: function() {},
	method2: function() {}
});
Ответить с цитированием
  #6 (permalink)  
Старый 19.09.2009, 19:16
Профессор
Отправить личное сообщение для Dmitry A. Soshnikov Посмотреть профиль Найти все сообщения от Dmitry A. Soshnikov
 
Регистрация: 25.02.2008
Сообщений: 707

Сообщение от Riim
Функции будут создаваться для каждого экземпляра, зачем засорять память одинаковыми функциями?
Да, спасибо, я знаю. Обычно методы выносят в прототип (как в классах). В любом случае, если создавать в конструкторе, хоть и ссылаясь на одну и ту же функцию, всё равно объекты будут иметь собственный свойства. Хотя, там может быть оптимизация с объединёнными объектами для функций.
__________________
Тонкости ECMAScript
Ответить с цитированием
  #7 (permalink)  
Старый 01.10.2009, 05:49
Новичок на форуме
Отправить личное сообщение для sig_al Посмотреть профиль Найти все сообщения от sig_al
 
Регистрация: 12.07.2009
Сообщений: 3

Сообщение от Riim Посмотреть сообщение
Функции будут создаваться для каждого экземпляра, зачем засорять память одинаковыми функциями? Я в таких случаях пишу так:
var MyClass = (function(methods) {
	return function() {
		Object.extend(this, methods);
		//
	};
})({
	method1: function() {},
	method2: function() {}
});
Такой синтаксис я видел в prototype.js, можно вопрос:
а что дают круглые скобки (function(){})()
Ответить с цитированием
  #8 (permalink)  
Старый 01.10.2009, 06:01
Аватар для Riim
Рассеянный профессор
Отправить личное сообщение для Riim Посмотреть профиль Найти все сообщения от Riim
 
Регистрация: 06.04.2009
Сообщений: 2,379

Непонятная структура кода (новичковый вопрос)
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Что за конструкция? (из jQuery) Yojik Общие вопросы Javascript 6 22.08.2010 15:46