Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   как правильно обращаться к свойствам объект внутри самого объекта ? (https://javascript.ru/forum/misc/55338-kak-pravilno-obrashhatsya-k-svojjstvam-obekt-vnutri-samogo-obekta.html)

mitiya 23.04.2015 16:54

как правильно обращаться к свойствам объект внутри самого объекта ?
 
вот пытаюсь написать такой класс (оставил только суть)

function Test(param1, param2, param3) {
	this.param1 = param1
	this.param2 = param2
	this.param3 = param3 || 4

	this.fn1 = function (callback) {

		как тут правильно получить param1,param2,param3 
		при том что бы не возникало проблем при вызове из fn2 и просто test.fn1() ?

	}

	this.fn2 = function (callback) {
		
		как тут правильно получить param1,param2,param3 ?
		
		как тут правильно вызывать fn1 ?
		
	}

}


я честно запутался в это this вообще :-/

Decode 23.04.2015 17:49

function Test(param1, param2, param3) {
	this.param1 = param1
	this.param2 = param2
	this.param3 = param3 || 4

	this.fn1 = function() {
           console.log(this.param1 + this.param2 + this.param3);
	}

	this.fn2 = function() {
	   console.log(this.param1 * this.param2 * this.param3);
           this.fn1();
	}
}

var a = new Test(1, 2, 3);
a.fn2();

mitiya 23.04.2015 21:12

так то работает да. А вот так нет.

function Test2() {
	this.testnf1 = function (x, callback){
		callback(x)
	}
}

function Test(param1, param2, param3, obj) {
	this.param1 = param1
	this.param2 = param2
	this.param3 = param3 || 4
	this.obj = obj
	

	this.fn1 = function() {
           this.obj.testnf1(this.param3, function(data){
				this.fn2(data)
		   });
	}

	this.fn2 = function(x) {
	   console.log(x);
	}	
}

var test2 = new Test2();
var a = new Test(2, 3, 4, test2);
a.fn1();


Как в колбэк тогда передать правильно this.fn2 ?
получить бы где-то сразу при вызове a.fn1() ссылку на объект , а потмо ее вместо this использовать.

Safort 23.04.2015 21:52

this динамичен. Прочитай про метод .bind(), он тебе должен помочь.

mitiya 23.04.2015 23:53

дак там все-равно надо передать контекст, а как мне получить этот контекст внутри объекта? context = this не работает, ибо это создает просто ссылку на this

mitiya 24.04.2015 12:55

кажется разобрался, нужно передать контекст в колбэк, с помощью dind

(function(data){this.fn2(data)}).bind(this)

function Test2() {
	this.testnf1 = function (x, callback){
		callback(x)
	}
}

function Test(param1, param2, param3, obj) {
	this.param1 = param1
	this.param2 = param2
	this.param3 = param3 || 4
	this.obj = obj
	

	this.fn1 = function() {
           this.obj.testnf1(this.param3, (function(data){
				this.fn2(data)
		   }).bind(this));
	}

	this.fn2 = function(x) {
	   console.log(x);
	}	
}

var test2 = new Test2();
var a = new Test(2, 3, 4, test2);
a.fn1();

Erolast 24.04.2015 13:54

Ты неправильно делаешь методы. При таком подходе будет создаваться свой собственный экземпляр метода каждому инстансу класса. Используй прототип, и путаницы меньше станет.
function Character(hp) {
    this.hp = hp;
}

Character.prototype.hit = function(amount) {
    this.hp -= amount;
}

Character.prototype.heal = function(amount) {
    this.hp += amount;
}

let character = new Character(1000);
console.log(character.hp); //1000

character.hit(400);
console.log(character.hp); // 600

character.heal(300);
console.log(character.hp); // 900

Erolast 24.04.2015 13:59

Ну и, когда разберешься с механикой - не оставайся на этом, переходи на классы ES6.

class Character {
    constructor(hp) {
        this.hp = hp;
    }
    
    hit(amount) {
       this.hp -= amount;
    }

    heal(amount) {
        this.hp += amount;
    }
}


Практически от вышеописанного они не отличаются ничем, просто синтаксический сахар. Пока что, пока все браузеры не реализовали, работает через трансляцию.

jscripter 25.04.2015 11:16

Цитата:

Сообщение от mitiya
как тут правильно получить param1,param2,param3

А в чем проблема то? У тебя this внутри функции будет указывать на объект.
function Test(param1, param2, param3) {
    this.param1 = param1
    this.param2 = param2
    this.param3 = param3 || 4
 
    this.fn1 = function (callback) {
       with(this) callback(param1, param2, param3)
    }
 
    this.fn2 = function (callback) {
       with(this) callback(param1, param2, param3)
    }
}

test=new Test(1,2,3)

test.fn1(function(x,y,z){alert(x+y*z)}) //  7
test.fn2(function(x,y,z){alert(x+y*z)}) //  7

Erolast 25.04.2015 20:23

Цитата:

with(this) callback(param1, param2, param3)
Счастливого тебе продробленного колена, когда кто-нибудь определит метод callback классу Test. Или даже просто свойство конкретному инстансу.


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