构造函数-简单命名空间中-Javascript

梅鲁

要在名称空间内定义一个函数构造函数。到目前为止,我定义构造函数的方式是一个不带NS的简单构造函数,并结合原型继承。

该代码看起来像:

 function mySuperObject() {
    var self = this;
    self.p1 = "";
    self.p2 = "jkejie";
    // and others
    }
 mySuperObject.prototype.func1 = function(){...}
 // and others

命名空间介绍:

阅读了许多文章之后,我决定以一种非常简单的方法来定义名称空间,这也许是最简单的方法。基本上,它只是定义一个指向对象字面量的变量,而内容就是对象(上面的代码片段中的“ mySuperObject”)。构造函数如下:mySuperObjectInNS。

对象的代码:

var MYNAMESPACE = {

    //some variable outside the object
    file : "ConstructorInNamespace_obj.js: ",

    //Defining contructor function inside a namespace
    mySuperObjectInNS : function(propOne, propTwo){

        var self = this;
        self.objectName = "mySuperObject";
        self.propertyOne = propOne;
        self.propertyTwo = propTwo;

        self.doSomething = function(){
            console.log(file + " doSomething called - function of object");
        };

        ///many more functions and attributes
    }
}

MYNAMESPACE.mySuperObjectInNS.prototype.specialFunction = function(){
    console.log(file + " specialFunction called - prototypical inheritance defined in file of object, outside of namespace");
};

///many more functions and attributes

在另一个文件中,可以实例化对象,如下所示:

...
var objOne = new MYNAMESPACE.mySuperObjectInNS("param11", "40");
//following line works just fine
objOne.doSomething();
 ....

问题:

  • 在我看来,所有这一切都与定义对象文字有关,而在尝试定义该对象的“私有”属性时,我将遇到麻烦。这样对吗?
  • 那mySuperObjectInNS仍然是构造函数吗?(对我来说,这似乎是另外一回事,即使我可以通过它实例化对象。
  • 是一种非常糟糕的命名方式还是一种不好的命名方式?
TJ人群

在我看来,所有这一切都与定义对象文字有关,而在尝试定义该对象的“私有”属性时,我将遇到麻烦。这样对吗?

“私有属性”与使用对象进行命名间隔无关。其实,回答这个问题本来的时候,我读到的“私人聚会”,因为这是相关的。

有很多方法可以在JavaScript中执行私有和半私有属性,但是它们与您如何创建构造函数以及该函数提供给对象的方法有关,而不与如何公开构造函数有关。“命名空间”对象与如何公开构造函数有关。

创建“私有”属性的一种常见模式是定义需要构造函数访问它们的方法,并构造函数创建“ properties”局部变量(因此它们根本不是真正的属性),如下所示:

function SuperObject() {
    var privateInformation;

    this.method = function() {
        // This can access `privateInformation`, which is completely
        // hidden from outside the constructor
    };
}

无论是在“命名空间”模式中还是单独执行此操作都没有关系。

另一方面,私有功能会影响模式。我将在下面显示两者。

提供私有函数的一个相当普遍的变体是使用函数创建对象,这也使您有机会创建私有函数:

var TheNamespace = function() {
    function privateFunction() {
    }

    function SuperObject() {
        var privateInformation;

        this.method = function() {
            // This can access `privateInformation`, which is completely
            // hidden from outside the constructor
        };
    }

    SuperObject.prototype.otherMethod = function() {
        // Can't access `privateInformation`, but has the advantage
        // that the function is shared between instances
    };

    return {
        SuperObject: SuperObject
    };
}();

// usage
var s = new TheNamespace.SuperObject();

那mySuperObjectInNS仍然是构造函数吗?(对我来说,这似乎是另外一回事,即使我可以通过它实例化对象。

是。构造函数是希望您使用的任何函数new

是一种非常糟糕的命名方式还是一种不好的命名方式?

将对象用作伪命名空间是常见的做法。您可能还考虑了各种异步模块定义(AMD)技术,这些技术在很大程度上使“命名空间”对象变得不必要。


发表您的评论:

您定义了一个自调用函数...。该函数返回一个对象?

它不是一个调用函数,而是一个内联调用函数,但是是的,它是一个返回对象的函数。

(如果这样的话,我认为缺少括号)

不,我们不需要任何不存在的括号,因为您已经看到外面括号的唯一原因是告诉解析器单词function开始的是表达式而不是声明。在上面我们不需要它,因为我们已经在任务的右侧,因此在function遇到问题时没有歧义

由于您提出了这种方法,因此定义ns的更好方法吗?

“更好”是一个主观术语。它为您提供了一个范围,您可以在其中定义要询问的私有功能。

而我经常也看到这样的选择:var = {} | someNSName;这是怎么回事?

如果您有几个文件可以将内容添加到“命名空间”中(很常见),那么您经常会在每个文件中看到以下内容:

var TheNamespace = TheNamespace || {};

要做的是,如果之前没有声明过该变量,声明它;如果还没有一个空对象,则为其分配一个空对象在第一个加载的文件中,发生这种情况:

  1. var被处理,并创建一个新的变量,TheNamespace与值undefined

  2. TheNameSpace = TheNameSpace || {}分配处理:由于undefined是falsey时,奇怪的强大||操作导致新的{},它被分配到TheNamespace.

接下来的文件加载,出现这种情况:

  1. var是一个空操作,因为变量已经存在。

  2. TheNameSpace = TheNameSpace || {}分配处理:由于TheNamespace具有非null对象的引用,它的truthy和好奇强大||到对象的引用运算符的结果TheNamespace是指。

也就是说,它根本没有效果。

这样可以使您以任何顺序加载文件,或单独加载一个文件。

这是一个例子:

thingy.js

var TheNamespace = TheNamespace || {};
TheNamespace.Nifty = function() {
    function privateFunction() {
    }

    function Nifty() {
        var privateInformation;

        this.method = function() {
            // Can access `privateInformation` here
        };
    }

    Nifty.prototype.otherMethod = function() {
        // ...
    };

    return Nifty;
}();

thingy.js

var TheNamespace = TheNamespace || {};
TheNamespace.Thingy = function() {
    function privateFunction() {
    }

    function Thingy() {
        var privateInformation;

        this.method = function() {
            // Can access `privateInformation` here
        };
    }

    Thingy.prototype.otherMethod = function() {
        // ...
    };

    return Thingy;
}();

该基本模式很多变体,特别是如果一个文件可能向添加多个内容时TheNamespace这是一个相当简洁的支持方法:

var TheNamespace = function(exports) {
    function privateFunction() {
    }

    function Nifty() {
        var privateInformation;

        this.method = function() {
            // Can access `privateInformation` here
        };
    }

    Nifty.prototype.otherMethod = function() {
        // ...
    };

    exports.Nifty = Nifty;

    function Thingy() {
        var privateInformation;

        this.method = function() {
            // Can access `privateInformation` here
        };
    }

    Thingy.prototype.otherMethod = function() {
        // ...
    };

    exports.Thingy = Thingy;
}(TheNamespace || {});

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Visual Studio关于函数不在全局命名空间中的警告

JavaScript:构造函数与原型

PHP:类与全局函数在命名空间中的静态方法?

函数与未命名命名空间中的参数的链接

无条件调用命名空间中的函数

如果函数是在匿名命名空间中声明的,是否可以在全局命名空间中定义?

在命名空间中使用全局命名空间中的函数

JavaScript-使用命名构造函数

在命名空间javascript中定义obj构造函数的最佳方法

Javascript构造函数继承

如何从命名空间中的函数调用div的onmouseover事件?

JavaScript构建构造函数的构造函数

命名空间Javascript中的递归函数

获取指向在命名空间中声明的函数的指针

全局命名空间中的JavaScript库功能-缺点吗?

在PHP命名空间中使用函数

如何使Clojure中.core命名空间中的所有命名空间中的函数可用?

命名空间中的调用函数

链接器在命名空间中找不到函数定义

调用函数和命名空间-JavaScript

如何获取 ClojureScript 命名空间中的公共函数列表?

在命名空间中定义模板类成员函数?

在 C++ 的命名空间中使用函数名?

用户在 Rcpp 中编写的标题/命名空间中的函数声明

在命名空间中调用 void 函数的 C++ 错误

如何在javascript中导入或使用在第三方命名空间中定义的函数?

JavaScript 构造函数用法

在单独的命名空间中使用具有大构造函数的类/结构的常量

Laravel:命名空间中的自定义函数