Контекст в методе класса как переменная
В качестве примера приведен класс:
var Class = {
initialize: function(data){
this.data = data;
},
add: function(node){
//add object
},
remove: function(node){
//remove object
},
findByIndex: function(id){
},
}
и так далее.
Вопрос: Как импортировать контекст в findByIndex
?
Например мне нужно использовать findByIndex
в другом классе как функция. Я понимаю что так и должно быть bind
, но как использовать это в моем классе?
findByIndex:function(id, ???context???){
????
}
/////////////////////// ДОБАВИТЬ ////////////////// это метод
L.Bookmarks = L.Class.extend({
findByIdRecursive: function(idNumber) {
var data = this.childNodes;
var returnItems = {};
function callback(node) {
if (parseInt(node.id) === idNumber)
returnItems = node;
};
for (var i = data.length - 1; i >= 0; i--) {
this.iterator(data[i], callback, this);
};
return returnItems;
},
iterator: function(node, callback, context) {
console.log(this)
callback.call(this, node);
var nodes = node.childNodes;
if (nodes === undefined) {
return;
};
for (var i = 0; i < nodes.length; i++) {
var iterNode = nodes[i];
this.iterator(iterNode, callback, this);
};
},
});
это еще один класс, который использует метод итератор:
L.Book = L.Class.extend({
findByIdRecursive: function(idNumber) {
var data = this.childNodes;
var returnItems = {};
function callback(node) {
console.log(this)
if (parseInt(node.id) === idNumber)
returnItems = node;
};
for (var i = data.length - 1; i >= 0; i--) {
var itertator = L.Book.iterator.call(L.Bookmarks, data[i], callback)
};
return returnItems;
},
});
Как видите, у второго класса нет итератора метода. Но, наконец, он должен использовать итератор, как владелец (с контекстом (это - L.Book))
2 ответа
Ты можешь использовать call
:
var b = new OtherClass();
// find Index 1 in b (OtherClass)
var element = Class.findByIndex.call(b,1);
Смотрите больше примеров на MDN
Кроме того, если вы используете классы ES6 (см. MDN), вы можете определить новый класс, используя extends
поэтому вы унаследуете методы более раннего класса:
class NewClass extends Class {
//...
}
С .bind
функция, которую вы можете повторно использовать findByIndex
несколько раз таким образом
var Utils = {
findByIndex: function(id){
return this.data[id];
}
}
var FirstObject = {
data : {
a : 'aaa',
b : 'bbb'
}
}
var SecondObject = {
data : {
d : 'ddd',
e : 'eee'
}
}
console.log(Utils.findByIndex.call(SecondObject, 'd'))
console.log(Utils.findByIndex.call(FirstObject, 'a'))