所以我正在寻找一种在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);
我的问题是我们不应该在构造函数中使用new吗?
var temporary_storage = new objectpassed.constructor();
然后我意识到传递的对象是使用对象文字{}并且构造函数为Object();
我创建了第一个类构造函数Person()
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!
所以我想知道我们还是在构造函数之前不使用new关键字?
我用谷歌搜索了,但没有找到任何令人满意的解释!
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 :(得分:2)
new constructor();
等于
(function(){
const obj = Object.create(constructor.prototype);
constructor.call(obj);
return obj;
})()
因此,使用 new 它会返回一个新对象,而不会只调用构造函数,因为它不会返回任何未定义的内容。所以是的,这是强制性的。
new A() === new A.prototype.constructor();
A() === A.prototype.constructor();