Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 23.04.2015, 16:54
Кандидат Javascript-наук
Отправить личное сообщение для mitiya Посмотреть профиль Найти все сообщения от mitiya
 
Регистрация: 13.01.2011
Сообщений: 114

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

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 вообще
Ответить с цитированием
  #2 (permalink)  
Старый 23.04.2015, 17:49
Профессор
Отправить личное сообщение для Decode Посмотреть профиль Найти все сообщения от Decode
 
Регистрация: 31.01.2015
Сообщений: 576

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();
Ответить с цитированием
  #3 (permalink)  
Старый 23.04.2015, 21:12
Кандидат Javascript-наук
Отправить личное сообщение для mitiya Посмотреть профиль Найти все сообщения от mitiya
 
Регистрация: 13.01.2011
Сообщений: 114

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

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 использовать.
Ответить с цитированием
  #4 (permalink)  
Старый 23.04.2015, 21:52
Аватар для Safort
Профессор
Отправить личное сообщение для Safort Посмотреть профиль Найти все сообщения от Safort
 
Регистрация: 23.12.2013
Сообщений: 1,856

this динамичен. Прочитай про метод .bind(), он тебе должен помочь.
Ответить с цитированием
  #5 (permalink)  
Старый 23.04.2015, 23:53
Кандидат Javascript-наук
Отправить личное сообщение для mitiya Посмотреть профиль Найти все сообщения от mitiya
 
Регистрация: 13.01.2011
Сообщений: 114

дак там все-равно надо передать контекст, а как мне получить этот контекст внутри объекта? context = this не работает, ибо это создает просто ссылку на this
Ответить с цитированием
  #6 (permalink)  
Старый 24.04.2015, 12:55
Кандидат Javascript-наук
Отправить личное сообщение для mitiya Посмотреть профиль Найти все сообщения от mitiya
 
Регистрация: 13.01.2011
Сообщений: 114

кажется разобрался, нужно передать контекст в колбэк, с помощью 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();
Ответить с цитированием
  #7 (permalink)  
Старый 24.04.2015, 13:54
Аватар для Erolast
Профессор
Отправить личное сообщение для Erolast Посмотреть профиль Найти все сообщения от Erolast
 
Регистрация: 24.09.2013
Сообщений: 1,436

Ты неправильно делаешь методы. При таком подходе будет создаваться свой собственный экземпляр метода каждому инстансу класса. Используй прототип, и путаницы меньше станет.
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 в 14:00.
Ответить с цитированием
  #8 (permalink)  
Старый 24.04.2015, 13:59
Аватар для Erolast
Профессор
Отправить личное сообщение для Erolast Посмотреть профиль Найти все сообщения от Erolast
 
Регистрация: 24.09.2013
Сообщений: 1,436

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

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

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


Практически от вышеописанного они не отличаются ничем, просто синтаксический сахар. Пока что, пока все браузеры не реализовали, работает через трансляцию.
Ответить с цитированием
  #9 (permalink)  
Старый 25.04.2015, 11:16
Интересующийся
Посмотреть профиль Найти все сообщения от jscripter
 
Регистрация: 25.04.2015
Сообщений: 4

Сообщение от 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
Ответить с цитированием
  #10 (permalink)  
Старый 25.04.2015, 20:23
Аватар для Erolast
Профессор
Отправить личное сообщение для Erolast Посмотреть профиль Найти все сообщения от Erolast
 
Регистрация: 24.09.2013
Сообщений: 1,436

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



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
jQuery (Как открыть объект в этом же окне, щёлкнув по нему мышкой) Объект кусок карты hadzhimuratov (X)HTML/CSS 32 18.06.2012 17:54
Как правильно прописать свой код в .js Всеми_Любимый Элементы интерфейса 6 23.02.2010 21:34
Как по событию вызвать метод определенного экземпляра объекта jvs jQuery 3 24.12.2009 16:04
Как правильно послать XML в POST запросе LowCoder AJAX и COMET 10 15.07.2009 23:20
Как правильно в Мазилле обращаться к фреймам и к их объектам? $Dim@n$777 Firefox/Mozilla 6 29.03.2009 23:32