2016-04-21 3 views
1

Существует класс, как, например:контекста в методе класса, как переменная

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???){ 
     ???? 
} 

/////////////////////// ADD ////////////////// это метод

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))

+0

Что такое 'это data'? – Bergi

+0

Что вы подразумеваете под "importing context"? К чему вы хотите обратиться? Каково тело вашего метода? Пожалуйста, покажите нам, как вы собираетесь «использовать« findByIndex »в другом классе как функцию *». – Bergi

+0

Возможный дубликат [Как изменить контекст функции в javascript] (http://stackoverflow.com/questions/1536164/how-to-change-the-context-of-a-function-in-javascript) – Whymarrh

ответ

0

Вы можете использовать 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 { 
    //... 
} 
0

с функцией .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')) 
+0

нормально, другая ситуация: Я использую метод другого класса в определенном месте findRecurcive: функция() { для (вар я .........) { findById()}} контекст действительно трудно для меня :)) –

+1

Вы даже не используете '.bind'? – Bergi

+0

Да, я использую leaflet.js, и примерно год я не использую call, bind и apply) –

Смежные вопросы