как правильно обращаться к свойствам объект внутри самого объекта ?
вот пытаюсь написать такой класс (оставил только суть)
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 вообще :-/ |
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(); |
так то работает да. А вот так нет.
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 использовать. |
this динамичен. Прочитай про метод .bind(), он тебе должен помочь.
|
дак там все-равно надо передать контекст, а как мне получить этот контекст внутри объекта? context = this не работает, ибо это создает просто ссылку на this
|
кажется разобрался, нужно передать контекст в колбэк, с помощью 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(); |
Ты неправильно делаешь методы. При таком подходе будет создаваться свой собственный экземпляр метода каждому инстансу класса. Используй прототип, и путаницы меньше станет.
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 |
Ну и, когда разберешься с механикой - не оставайся на этом, переходи на классы ES6.
class Character { constructor(hp) { this.hp = hp; } hit(amount) { this.hp -= amount; } heal(amount) { this.hp += amount; } } Практически от вышеописанного они не отличаются ничем, просто синтаксический сахар. Пока что, пока все браузеры не реализовали, работает через трансляцию. |
Цитата:
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 |
Цитата:
|
Часовой пояс GMT +3, время: 10:58. |