3

我是一名 C++/Java 开发人员,负责一个 javascript 项目,但我似乎无法解决这个问题。

我正在使用一个通过直接分配定义命名空间的 javascript 文件,如此处所述

所以这是我对一个过于简化的示例命名空间的尝试

// 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 文件

4

6 回答 6

3

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

于 2012-07-24T20:15:47.760 回答
3

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

要实例化它,命名空间必须声明为函数,而不是对象字面量,并使用new关键字引用。只有函数可以用于 JavaScript 的实例化。

function NS() {}
var ns1 = new NS();
var ns2 = new NS();
于 2012-07-24T20:16:57.447 回答
1

首先,JavaScript 中没有命名空间。{}只是一个对象字面量,与new Object().

其次,您不会通过给它们几个引用来实例化对象。您可以使用以下方法实例化一个对象Object.create

var nsInstance1 = Object.create(ns);
var nsInstance2 = Object.create(ns);
于 2012-07-24T20:16:14.500 回答
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 示例

于 2012-07-24T20:17:35.000 回答
0

Since your are taking ns at a global scope, you can just directly assign values to it like-

//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);
}

于 2012-07-24T20:27:16.520 回答
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);
}
于 2012-07-24T20:19:18.433 回答