在属性call()中访问对象?

时间:2015-03-14 02:18:36

标签: javascript

出现一个奇怪的问题 - 出于某种原因,使用call()方法访问属性中的父对象只有在函数内部返回时才有效。

为什么我在第二个例子中无法访问MyObject,但我可以在第一个例子中?

我需要让第二个工作,因为我不想在循环中不断调用函数,因为它很慢并且看起来很糟糕。

我现在拥有的东西:

var MyObject = { 
   "selectorArray": ['[id*="example"]','[class*="example"]'],
   "all": function() {
      return Array.prototype.slice.call(document.querySelectorAll(MyObject.selectorArray.join())); 
   },
   "somemethod": function () {
             for (var i = 0; i < MyObject.all().length; i++) {
                   MyObject.all()[i] // do something etc
             }
    }
    .. I need to use all() in loops other methods also
}

我想要什么(更快更好看)

var MyObject = { 
   "selectorArray": ['[id*="example"]','[class*="example"]'],
   "all": Array.prototype.slice.call(document.querySelectorAll(MyObject.selectorArray.join())),
   "somemethod": function () {
             for (var i = 0; i < MyObject.all.length; i++) {
                   MyObject.all[i] // do something etc
             }
    }
    .. I need to use all in loops other methods also
}

1 个答案:

答案 0 :(得分:5)

在评估对象文字时,

MyObject不存在。您无法使用MyObject.anything来定义文字中MyObject.all的值,因为您指的是尚未创建的对象的属性。相反,您可以从文字中提取所需的值:

var selectorArray = ['[id*="example"]','[class*="example"]'];
var MyObject = { 
   "selectorArray": selectorArray,
   "all": Array.prototype.slice.call(document.querySelectorAll(selectorArray.join())),
   "somemethod": function () {
             for (var i = 0; i < MyObject.all.length; i++) {
                   MyObject.all[i] // do something etc
             }
    }
    ...
};