2017-12-02 20 views
0

だから私はJavaScriptで深いクローンへの道のためのオブジェクトを検索し、この解決策を見つけた:javascriptのオブジェクトでコンストラクタ関数を呼び出す方法は?

function keepCloning(objectpassed) { 
    if (objectpassed === null || typeof objectpassed !== 'object') { 
    return objectpassed; 
    } 
// give temporary-storage the original obj's constructor 
var temporary_storage = objectpassed.constructor(); 
    for (var key in objectpassed) { 
    temporary_storage[key] = keepCloning(objectpassed[key]); 
    } 
    return temporary_storage; 
} 
var employeeDetailsOriginal = { name: 'Manjula', age: 25, Profession: 'Software Engineer' }; 
var employeeDetailsDuplicate = (keepCloning(employeeDetailsOriginal)); 
employeeDetailsOriginal.name = "NameChanged"; 
console.log(employeeDetailsOriginal); 
console.log(employeeDetailsDuplicate); 

私の質問は、それは私たちがコンストラクタで新しいを使用すべきではありませんでしたか?

var temporary_storage = new objectpassed.constructor(); 

次に、渡されたオブジェクトがオブジェクトリテラル{}を使用して作成され、コンストラクタがObject()として作成されていることがわかりました。

私はkeepCloningメソッドを使用する場合

function Person(name, age, profession){ 
this.name=name; 
this.age=age; 
this.profession=profession; 
} 
var employeeDetailsOriginal = new Person('Manjula', 25,'Software Engineer'); 
var employeeDetailsDuplicate (keepCloning(employeeDetailsOriginal)); 

は今、それはtemporary_storageが

objectpassed.constructor(); 

は未定義戻っていなければならないということ未定義の意味であるというエラーを投げた)(ファーストクラスのコンストラクタ関数の人を作りました!

私は、コンストラクタの前に新しいキーワードを使用しないことを知りたいのですか?

私はそれを見つけましたが、満足のいく説明は見つかりませんでした。 (2)の問題

function A(){ 

} 

var a = new A(); //1 

var a1= A.prototype.constructor(); //2 

var a1 = new A.prototype.constructor(); //3 

の同じコンテキストで

2)及び(3)のオブジェクトを構築するための)1(と全く同様の方法ですか?

+0

誰かが私は正しい答えを与える正おりませんので、コンストラクタを呼び出すための正しい方法についてのご質問にお答えしますが、私は深いコピーにオブジェクトを必要とするとき、私はちょうど 'VARのNEWOBJECT = JSONを行います。 parse(JSON.stringify(oldobject)) 'これはあなたのユースケースで機能しますか? – Eric

+0

Jsonメソッドは動作しますが、newがコンストラクタで使用されるかどうかに関して疑問がありましたか? –

+0

はい。それは私が私より賢く誰かに去るという良い質問です。しかし、あなたがJSON.parseのショートカットを知っていることを確認したかったのです:) – Eric

答えて

2
new constructor(); 

(function(){ 
    const obj = Object.create(constructor.prototype); 
    constructor.call(obj); 
    return obj; 
})() 

に等しく、それだけでコンストラクタ関数を呼び出しせず、そしてそれはその未定義何も返さないように新しいでそれは、新しいオブジェクトを返します。はい、その必須です。他

new A() === new A.prototype.constructor(); 
A() === A.prototype.constructor(); 
関連する問題