2013-08-26 3 views
5

Когда-то я слышал, что было хорошей практикой обернуть ваш код в большом объекте, чтобы служить пространством имен, чтобы уменьшить глобальное пространство пространства имен и облегчить экспорт библиотеки, поэтому я попробовал это ,Вызов методов-членов до объявления объекта завершен

var wrapper = { 
    foo: function(){ 
     return 42; 
    }, 
    bar: this.foo() 
}; 

Не удается, утверждая, что «foo не определен». Вызов методов до завершения объявления объекта, вероятно, плохо, поэтому я переместил панель, и она сработала.

var wrapper = { 
    foo: function(){ 
     return 42; 
    }, 
}; 
wrapper.bar = wrapper.foo(); 

Я чувствую, что это может стать своего рода некрасиво, особенно с вложенными пространствами имен и таких, поэтому есть ли обходные пути, которые не делают его трудно увидеть все члены обертку в один раз?

+0

Почему бы вам нужно позвонить любому метод при объявлении? Возможно, вы хотите использовать функцию, вызванную немедленно (* IEFE *). Также проверьте шаблон * модуля *. – Bergi

ответ

1

Проблема в том, что this будет равен глобальному контексту. Вы должны получить доступ к функции следующим образом:

var wrapper = { 
    foo: function(){ 
     return 42; 
    }, 
    bar: null, 
    init : function() { 
     // all initialization code goes here 
     wrapper.bar = wrapper.foo(); 
    } 
}; 

wrapper.init(); 

Этот метод отлично подходит для организации кода на логические куски, так что вы и будущие разработчики могут легко найти то, что вы ищете в вашем JavaScript.

+0

Хм утверждает, что он «не может вызывать метод« foo »неопределенного», подразумевая, что оболочка не определена? –

+0

Обновленный код для использования. Наиболее распространенное использование этой архитектуры - включение некоторой функции init, которая выполняет все инициализации переменных. Это можно сделать в событии onload документа в случае, если ваши переменные будут содержать ссылки на DOM, то есть: 'wrapper.bar = document.getElementById ('bar');' что полезно, когда вы хотите ограничить количество раз вы ищете DOM –

0

Использование this, как это не будет работать, если обертка не является 1) функцией, и 2) инстанцирование его использовать:

var wrapper = function() { 
    this.foo = function() { return 42; } 
    this.bar = this.foo(); 
}; 

var wrapperInstance = new wrapper(); 
alert(wrapperInstance.bar()); // 42 
wrapperInstance.foo(); // also works 
+0

Я предполагаю, что вы имели в виду 'alert (wrapperInstance.bar); wrapperInstance.foo(); ', считая, что bar не является функцией и что оболочка не имеет членов. Это также кажется излишним для оболочки, поскольку создание конструктора, который вы собираетесь использовать только однажды, кажется глупым ... –

+0

Да, я пошел и отредактировал его соответствующим образом. Это не так глупо - подумайте о синглтонном узоре. :) –

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