Передача функции в конструктор [дубликат]

287
04 марта 2017, 04:52

На данный вопрос уже ответили:

  • Потеря контекста вызова 3 ответа

Имеется конструктор:

var Constructor = function (str) {
    this.str = str;
};
Constructor.prototype.someFunc = function () {
    //code
};
var a = new Constructor('hello');
var b = new Constructor('world');

Нужно чтобы у a и b дополнительно были разные методы. Приходит в голову только передача функции через параметр.

var a = new Constructor('hello', func(str, someData){
    //some code
});
var Constructor = function (str, func) {
    this.str = str;
    this.func = func.bind(null, this.str);
};

Но как вызвать ее в контексте нового экземпляра объекта, ведь нечто подобное вызовет ее в контексте конструктора?

Answer 1
var Constructor = function (str, func) {
    this.str = str;
    this.func = funс;
};
var a = new Constructor('hello', function() {
    //some code
    console.log(this.str);
});
var b = new Constructor('bye', function() {
    //some code
    console.log(this.str);
});

a.func(); // hello
b.func(); // bye

В конструкторе this ссылается на экземпляр, поэтому просто присвойте значение, и функция станет методом

Если очень хочется bind

var Constructor = function (str, func) {
    this.str = str;
    this.func = funс.bind(this); // this опять же ссылка на экземпляр
};

Но так, у a.func всегда будет контекст экземпляра (a в данном случае) и ,передавая потом где-то этот метод как callback, контекст теряться уже не будет

READ ALSO
Promise и foreach

Promise и foreach

Вопрос: практикуюсь в JavaScript по одноименной книжке, решил написать запрос на ресурс через Promises, однако они возвращают undefinedВ чем может быть...

268
Закладки на JavaScript

Закладки на JavaScript

Всем доброго пятничного дняКак я писал ранее, я изучаю JavaScript по книге Хавербеке

285
Проблема при передачи AJAX запроса в Laravel

Проблема при передачи AJAX запроса в Laravel

Не понемаю почему не получается передать запрос в контроллер средствами AJAX Цель нудно изменить значение $article->public на 0 (по дефолту 1)

274