【问题标题】:context in class method as variable类方法中的上下文作为变量
【发布时间】:2016-08-15 00:19:05
【问题描述】:

有一个类作为例子:

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;
    },
});

如您所见,第二类没有方法迭代器。但最后它应该使用迭代器,比如 owner(with context(this - L.Book))

【问题讨论】:

标签: javascript oop function-binding


【解决方案1】:

使用.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'))

【讨论】:

  • 好的,另一种情况:我在特定位置使用另一个类的方法 findRecurcive:function(){ for(var i.........){ findById()} } 上下文是对我来说真的很难:))
  • 呃,你甚至没有使用.bind
  • 是的,我使用leaflet.js,大约一年来我没有使用调用、绑定和应用)
【解决方案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 {
    //...
}

【讨论】:

    猜你喜欢
    • 2011-02-05
    • 1970-01-01
    • 1970-01-01
    • 2015-05-26
    • 2017-04-06
    • 2018-08-25
    • 1970-01-01
    • 2020-10-26
    相关资源
    最近更新 更多