2017-12-02 145 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()制成;

我做了第一类的构造函数的人()

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

现在,当我用keepCloning方法,它抛出一个错误,temporary_storage是不确定的含义

objectpassed.constructor(); 

必须返回undefined !

所以我想知道,我们或我们不使用构造函数之前的新关键字?

我使用了它,但没有找到任何令人满意的解释!

2)在问题

function A(){ 

} 

var a = new A(); //1 

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

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

的相同的上下文哪(2)和(3)是完全相似的方法,以(1)用于构造A的对象?

+0

其他人会回答你的问题要调用构造函数,因为我不积极,我会给出正确的答案正确的方式,但是当我需要深拷贝的对象我只是做'VAR NEWOBJECT = JSON。解析(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(); 
相关问题