Почему Javascript Namespaces, если прототипное наследование обеспечивает все это - PullRequest
4 голосов
/ 09 июля 2011

Используя приведенную ниже конструкцию, вы можете иметь приватные переменные, публичные и приватные функции.Итак, почему есть все различные способы создания пространства имен?

Является ли пространство имен радикально отличным от функции со связанным поведением и областью действия?

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

Кажется, япропускаю фундаментальную точку ..

// Constructor for customObject  
function customObject(aArg, bArg, cArg)  
{  
    // Instance variables are defined by this  
    this.a = aArg;  
    this.b = bArg;  
    this.c = cArg;  
}  

// private instance function  
customObject.prototype.instanceFunctionAddAll = function()  
{  
    return (this.a + this.b + this.c);  
}  

/*  
  Create a "static" function for customObject.  
  This can be called like so : customObject.staticFunction  
*/  
customObject.staticFunction = function()  
{  
    console.log("Called a static function");  
}  

// Test customObject  
var test = new customObject(10, 20, 30);  
var retVal = test.instanceFunctionAddAll();  
customObject.staticFunction();  

1 Ответ

4 голосов
/ 09 июля 2011

Дело в том, что у вас может быть более одной функции, но вы хотите загрязнять глобальную область только одной переменной («пространством имен»).

// Wrap in a immediately-executing anonymous function to avoid polluting
// the global namespace unless we explicitly set properties of window.
(function () {
    function CustomObject(/*...*/) { /*...*/ } 
    // Add methods, static methods, etc. for CustomObject.

    function CustomObject2(/*...*/) { /*...*/ } 
    // Add methods, static methods, etc. for CustomObject2.

    var CONSTANT_KINDA = "JavaScript doesn't really have constants";

    // Create a namespace, explicitly polluting the global scope,
    // that allows access to all our variables local to this anonymous function
    window.namespace = {
        CustomObject: CustomObject,
        CustomObject2: CustomObject2,
        CONSTANT_KINDA: CONSTANT_KINDA
    };
}());

Кроме того, Феликс прав, ваша «частная» функция экземпляра на самом деле очень общедоступна. См. «Частные члены в JavaScript» Крокфорда , если вам нужны настоящие частные методы.

...