如何在javascript中调用对象的构造函数?

时间:2017-12-02 17:07:31

标签: 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);

我的问题是我们不应该在构造函数中使用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对象的方法完全相似?

1 个答案:

答案 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();