要在名称空间内定义一个函数构造函数。到目前为止,我定义构造函数的方式是一个不带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();
....
问题:
在我看来,所有这一切都与定义对象文字有关,而在尝试定义该对象的“私有”属性时,我将遇到麻烦。这样对吗?
“私有属性”与使用对象进行命名间隔无关。其实,回答这个问题本来的时候,我读到的“私人聚会”,因为这将是相关的。
有很多方法可以在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 || {};
要做的是,如果之前没有声明过该变量,则声明它;如果还没有一个空对象,则为其分配一个空对象。在第一个加载的文件中,发生这种情况:
将var
被处理,并创建一个新的变量,TheNamespace
与值undefined
。
在TheNameSpace = TheNameSpace || {}
分配处理:由于undefined
是falsey时,奇怪的强大||
操作导致新的{}
,它被分配到TheNamespace.
当接下来的文件加载,出现这种情况:
的var
是一个空操作,因为变量已经存在。
的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] 删除。
我来说两句