23.04.2015, 16:54
|
Кандидат Javascript-наук
|
|
Регистрация: 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 вообще
|
|
23.04.2015, 17:49
|
Профессор
|
|
Регистрация: 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();
|
|
23.04.2015, 21:12
|
Кандидат Javascript-наук
|
|
Регистрация: 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 использовать.
|
|
23.04.2015, 21:52
|
|
Профессор
|
|
Регистрация: 23.12.2013
Сообщений: 1,856
|
|
this динамичен. Прочитай про метод .bind(), он тебе должен помочь.
|
|
23.04.2015, 23:53
|
Кандидат Javascript-наук
|
|
Регистрация: 13.01.2011
Сообщений: 114
|
|
дак там все-равно надо передать контекст, а как мне получить этот контекст внутри объекта? context = this не работает, ибо это создает просто ссылку на this
|
|
24.04.2015, 12:55
|
Кандидат Javascript-наук
|
|
Регистрация: 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();
|
|
24.04.2015, 13:54
|
|
Профессор
|
|
Регистрация: 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.
|
|
24.04.2015, 13:59
|
|
Профессор
|
|
Регистрация: 24.09.2013
Сообщений: 1,436
|
|
Ну и, когда разберешься с механикой - не оставайся на этом, переходи на классы ES6.
class Character {
constructor(hp) {
this.hp = hp;
}
hit(amount) {
this.hp -= amount;
}
heal(amount) {
this.hp += amount;
}
}
Практически от вышеописанного они не отличаются ничем, просто синтаксический сахар. Пока что, пока все браузеры не реализовали, работает через трансляцию.
|
|
25.04.2015, 11:16
|
Интересующийся
|
|
Регистрация: 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
|
|
25.04.2015, 20:23
|
|
Профессор
|
|
Регистрация: 24.09.2013
Сообщений: 1,436
|
|
Цитата:
|
with(this) callback(param1, param2, param3)
|
Счастливого тебе продробленного колена, когда кто-нибудь определит метод callback классу Test. Или даже просто свойство конкретному инстансу.
|
|
|
|