如何创建全局JavaScript命名空间的实例?

时间:2012-07-24 20:12:23

标签: javascript instance

我是一名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文件

6 个答案:

答案 0 :(得分:3)

只需创建第二个命名空间(对象,真的):nsInstance2 = {}; - 这里的问题是nsInstance1nsInstance2都指向同一个对象,所以很自然地,如果你改变一个的属性,它将反映在另一个。

答案 1 :(得分:2)

JavaScript中的复杂数据类型被复制为引用,因此您的nsInstance1nsInstance2变量仅指向命名空间对象 - 它们不会复制或实例化它。

要实例化它,必须将名称空间声明为函数,而不是对象文字,并使用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); }

相关问题