我是一名C ++ / Java开发人员,他的任务是javascript项目,我似乎无法解决这个问题。
我正在使用javascript文件,该文件通过直接赋值来定义名称空间,如here
所述所以这是我尝试过度简化的示例命名空间
// testns.js
var ns = { }
ns.val = -1;
ns.setVal = function(newVal) {
this.val = newVal;
}
这就是我想做的事情
//myScript.js
function testNamespaceInstances()
{
var nsInstance1 = ns;
nsInstance1.setVal(1);
var nsInstance2 = ns;
nsInstance2.setVal(2);
console.log("nsInstance1.val: " + nsInstance1.val);
console.log("nsInstance2.val: " + nsInstance2.val);
}
该功能将输出
nsInstance1.val: 2
nsInstance2.val: 2
如果没有修改testns.js文件,我可以做什么,声明命名空间,以便函数输出
nsInstance1.val: 1
nsInstance2.val: 2
编辑:在示例代码中添加了一些更多细节。我还想注意我正在尝试简化我正在使用的更复杂的javascript文件
答案 0 :(得分:3)
只需创建第二个命名空间(对象,真的):nsInstance2 = {};
- 这里的问题是nsInstance1
和nsInstance2
都指向同一个对象,所以很自然地,如果你改变一个的属性,它将反映在另一个。
答案 1 :(得分:2)
JavaScript中的复杂数据类型被复制为引用,因此您的nsInstance1
和nsInstance2
变量仅指向命名空间对象 - 它们不会复制或实例化它。
要实例化它,必须将名称空间声明为函数,而不是对象文字,并使用new
关键字引用。在JavaScript中实例化时只能使用函数。
function NS() {}
var ns1 = new NS();
var ns2 = new NS();
答案 2 :(得分:1)
首先,JavaScript中没有名称空间。 {}
只是一个对象字面值,与new Object()
相同。
其次,您不通过为对象提供多个引用来实例化对象。您可以使用Object.create
实例化对象:
var nsInstance1 = Object.create(ns);
var nsInstance2 = Object.create(ns);
答案 3 :(得分:1)
您可以执行以下操作:
var ns = function() {
return {};
};
和
function testNamespaceInstances() {
var nsInstance1 = new ns;
nsInstance1.val = 1;
var nsInstance2 = new ns;
nsInstance2.val = 2;
console.log("nsInstance1.val: " + nsInstance1.val);
console.log("nsInstance2.val: " + nsInstance2.val);
}
<强> jsFiddle example 强>
答案 4 :(得分:0)
//myScript.js
Object.prototype.clone = function() {
var newObj = (this instanceof Array) ? [] : {};
for (var i in this) {
if (i == 'clone') continue;
if (this[i] && typeof this[i] == "object") {
newObj[i] = this[i].clone();
} else newObj[i] = this[i]
} return newObj;
};
function testNamespaceInstances()
{
var nsInstance1 = ns.clone();
nsInstance1.val = 1;
var nsInstance2 = ns.clone();
nsInstance2.val = 2;
console.log("nsInstance1.val: " + nsInstance1.val);
console.log("nsInstance2.val: " + nsInstance2.val);
}
答案 5 :(得分:0)
由于您正在全局范围内使用ns
,因此您可以直接为其分配值,如 -
//testns.js
var ns = { }
ns.val = -1;
function testNamespaceInstances()
{
ns.val1=1;
ns.val2=2;
console.log("ns.val1: " + ns.val1);
console.log("ns.val2: " + ns.val2);
}
var ns = { }
ns.val = -1;
function testNamespaceInstances()
{
ns.val1=1;
ns.val2=2;
console.log("ns.val1: " + ns.val1);
console.log("ns.val2: " + ns.val2);
}