доступ к моим публичным методам из моего пространства имен - PullRequest
3 голосов
/ 05 января 2011

Я нахожусь в процессе создания своего собственного пространства имен в JavaScript ...

(function(window){
    (function(){
        var myNamespace = {
            somePublicMethod: function(){
            },
            anotherPublicMethod: function(){
            }
        }

        return (window.myNamespace = window.my = myNamespace)
    }());
})(window);

Я новичок в этих видах передовых методов JavaScript, и я пытаюсь найти лучший способвызывать публичные методы из моего пространства имен.Похоже, что в моих открытых методах this устанавливается на myNamespace.

Должен ли я вызывать открытые методы, такие как ...

AnotherPublicMethod: function(){
   this.somePublicMethod()
}

или ...

AnotherPublicMethod: function(){
   my.somePublicMethod();
}

есть ли разница?

1 Ответ

3 голосов
/ 05 января 2011

На мой взгляд, если вы используете this, вы используете прямую ссылку на объект, тогда как если вы используете my, интерпретатору потребуется пройти по цепочке контекста, пока он не найдет my каксвойство window.

Но могут быть и другие аргументы.

РЕДАКТИРОВАТЬ:

Я должен отметить, что, поскольку this определяется как как вызывается функция, для этого требуется, чтобы объектом активации был этот объект.

Так что это будет работать:

my.anotherPublicMethod();

Но этоне будет:

var test = my.anotherPublicMethod;
test();

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


Немного не по теме, но я бы также отметил, что ваш код не будет работать так, как он есть.

Эта строка:

return (window.myNamespace = window.my = myNamespace)

... не имеет доступа к переменной myNamespace.

Возможно, вы имели в виду нечто большее?

(function(window){
    window.myNamespace = window.my = (function(){
        var myNamespace = {
            somePublicMethod: function(){
            },
            anotherPublicMethod: function(){
            }
        }
        return myNamespace;
    }());
})(window);
...