2015-03-14 4 views
1

Наличие странной проблемы - по какой-либо причине доступ к родительскому объекту внутри свойства с использованием метода 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 
} 

ответ

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 
      } 
    } 
    ... 
}; 
+0

Интересно, так как же оно работает внутри методов? все методы в объекте, возвращаемом после того, как объект был инициализирован? – user2381114

+1

Потому что, когда вы создаете объект '' somemethod ": function() {...}' только устанавливает свойство 'somemethod' функции, но функция не выполняется до тех пор, пока не будет вызван метод. Таким образом, ссылка в методе 'MyObject' не оценивается до вызова метода. – Seamus

+2

@ user2381114 Он работает внутри методов, потому что, когда методы действительно нужны и вызываются, литерал объекта был долго оценен и создан. В результате код внутри методов имеет доступ к фактическому объекту –

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