Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Возможна ли конструкция вида this.this.property? (https://javascript.ru/forum/misc/5134-vozmozhna-li-konstrukciya-vida-property.html)

sig_al 18.09.2009 16:20

Возможна ли конструкция вида 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()?

Octane 18.09.2009 16:44

Из вашего примера не понятно, на что будет указывает 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();

sig_al 18.09.2009 18:09

Т.е., если я правильно понял (немного запутано написано) необходимо определить 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';
}

Dmitry A. Soshnikov 18.09.2009 23:55

Цитата:

Сообщение от 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

Riim 19.09.2009 16:52

Цитата:

Сообщение от Dmitry A. Soshnikov
А зачем Вы описываете методы отдельно и потом присваиваете ссылки на них this-методам?

Функции будут создаваться для каждого экземпляра, зачем засорять память одинаковыми функциями? Я в таких случаях пишу так:
var MyClass = (function(methods) {
	return function() {
		Object.extend(this, methods);
		//
	};
})({
	method1: function() {},
	method2: function() {}
});

Dmitry A. Soshnikov 19.09.2009 19:16

Цитата:

Сообщение от Riim
Функции будут создаваться для каждого экземпляра, зачем засорять память одинаковыми функциями?

Да, спасибо, я знаю. Обычно методы выносят в прототип (как в классах). В любом случае, если создавать в конструкторе, хоть и ссылаясь на одну и ту же функцию, всё равно объекты будут иметь собственный свойства. Хотя, там может быть оптимизация с объединёнными объектами для функций.

sig_al 01.10.2009 05:49

Цитата:

Сообщение от Riim (Сообщение 30476)
Функции будут создаваться для каждого экземпляра, зачем засорять память одинаковыми функциями? Я в таких случаях пишу так:
var MyClass = (function(methods) {
	return function() {
		Object.extend(this, methods);
		//
	};
})({
	method1: function() {},
	method2: function() {}
});

Такой синтаксис я видел в prototype.js, можно вопрос:
а что дают круглые скобки (function(){})()

Riim 01.10.2009 06:01

http://javascript.ru/forum/misc/4071...jj-vopros.html


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