3

私は Javascript プロジェクトを任されている C++/Java 開発者ですが、この問題を理解できないようです。

ここで説明されているように、直接割り当てによって名前空間を定義する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

Just create a second namespace (object, really): nsInstance2 = {}; -- the problem here is that both nsInstance1 and nsInstance2 are pointing to the same object, so naturally, if you change the properties of one, it'll be reflected in the other.

于 2012-07-24T20:15:47.760 に答える
3

Complex data types in JavaScript are copied as references, so your nsInstance1 and nsInstance2 variables merely point to the namespace object - they do not copy or instantiate it.

To instantiate it, the namespace must be declared as a function, not an object literal, and referenced with the new keyword. Only functions can be used in instantiation in JavaScript.

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

First, there are no namespaces in JavaScript. {} is just an object literal, the same as new Object().

Second, you don't instantiate objects by giving them several references. You can instantiate an object with 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
//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 に答える
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);
}

于 2012-07-24T20:27:16.520 に答える