1

「Node」というプロトタイプのインスタンス「aNode」が与えられました。この議論に続いて、私は次のことを試みます。

var newNode = clone(aNode);

クローン関数は次のようになります。

function clone(obj) {
    if (null == obj || "object" != typeof obj) return obj;
    var copy = obj.constructor();
    for (var attr in obj) {
        if (obj.hasOwnProperty(attr)) copy[attr] = obj[attr];
    }
    return copy;
}

obj.consturctor()が適切にaNodeのコンストラクターを参照しているにもかかわらず、コピーは「アンダーファインド」です。理由が見つかりません:(

この方法は間違っていますか、それとも何かが足りませんか:)?

ありがとう、J。

編集:ノードのプロトタイプは次のようになります。

Node.prototype = new PhysicsNode();
Node.prototype.constructor=Node;

function Node() {

    PhysicsNode.call(this);

    this.setBounds(0, 0, 0, 0);
    this.createStaticBody();
}
4

2 に答える 2

2

Ok。ここ

var copy = obj.constructor();

は単なる関数呼び出しであり、コンストラクター関数Nodeは何も返しません。new新しいオブジェクトを作成するには、キーワードを使用する必要があります。

var copy = new obj.constructor();
于 2012-04-11T03:42:55.720 に答える
1
var copy = obj.constructor();

この行は、のコンストラクターを受け取り、objそれを呼び出して、結果をに割り当てcopyます。

のようobjNode、行によると、Node.prototype.constructor=Node;それはそれを保持しobj.constructor === Nodeます。

関数を見てくださいNode

function Node() {

    PhysicsNode.call(this);

    this.setBounds(0, 0, 0, 0);
    this.createStaticBody();
}

この関数はコンストラクターであり、newキーワードを指定して呼び出す必要があります。キーワードで呼び出されない場合はnew、通常の関数です。ステートメントがないため、この関数は何も返し ませんreturn

したがって、

var copy = obj.constructor();

に何も割り当てないのでobj、も割り当てobjますundefined

ついに、

return copy;

この未定義の値をclone関数から返します。

于 2012-04-10T16:20:09.037 に答える