このトピックをもう一度読むのは本当に面倒です。コードを掘り下げる前に、解決策の 1 つは、JavaScript でプロトタイプとオブジェクトを取得しないことです。しかし、この時点で私はそう思います。
問題は次のとおりです:
JavaScript クラス (プロトタイプで作成) を複製して、後で拡張および実行するときに「複製された」クラスがそのまま残るようにする方法は?
function clone(obj){
if(obj == null || typeof(obj) != 'object')
return obj;
var temp = new obj.constructor();
for(var key in obj)
temp[key] = clone(obj[key]);
return temp;
}
var FOO = function() {
var myBAR = clone(BAR);
myBAR.prototype = jQuery.extend(true, myBAR.prototype, this); // deep cloning twice and extending with this
console.log("FOO:", this.name);
new myBAR();
};
FOO.prototype = {
name: "FOO"
};
var BAR = function() {
console.log("BAR:", this.name);
};
BAR.prototype = {
name: "BAR"
};
new FOO(); // returns FOO: FOO and BAR: FOO
new BAR(); // returns BAR: FOO should return BAR: BAR
私が正しければ、new BAR()
(after )の2番目の呼び出しは、現時点でnew FOO()
は返されBAR: BAR
ないはずです。BAR: FOO
この問題の可能な解決策の 1 つは、clone
関数を次のように完全に書き直すことです。
function clone(obj) {
return eval("("+obj.toString()+")"); // the same as eval(uneval(obj));
}
しかし、このアプローチには大きな欠点があり、動的に作成されたオブジェクトを渡すことができません。
何か案は?