使用object.create和new运算符创建继承之间的区别

时间:2015-03-25 20:24:03

标签: javascript inheritance prototype prototypal-inheritance

请找到我创建继承的两种方法。有人可以解释一下每种类型的情况。

方法1:

function Person(name){
    this.name = name;
}

Person.prototype.getName = function(){
    return this.name;
}

function Employee(name, designation){
    Person.call(this, name);
   this.designation = designation;
}

Employee.prototype = new Person();
Employee.prototype.constructor = Employee;

Employee.prototype.getDesignation = function(){
    return this.designation;
}

new Employee("Jagadish", "Cons");

enter image description here

方法2:

function Person(name){
    this.name = name;
}

Person.prototype.getName = function(){
    return this.name;
}

function Employee(name, designation){
    Person.call(this, name);
    this. designation = designation;
}

Employee.prototype = Object.create(Person.prototype);
Employee.prototype.constructor = Employee;

Employee.prototype.getDesignation = function(){
    return this.designation;
}

new Employee("Jagadish", "Cons");

enter image description here

我已经插入了每个对象的控制台图像。在第一种方法中,我可以在人类中看到未定义的名称属性(请参阅第一个屏幕截图)。

但是在第二种继承方法的情况下,人类中没有名称属性

有人可以深入解释这种行为以及背景中发生的事情。

1 个答案:

答案 0 :(得分:1)

这里没有任何神奇的东西,程序正在按照它所要做的去做。

当您致电new Person时,您正在创建一个新对象。该对象具有name属性,因为您在函数内明确指定this.name

然而,

Object.create会创建一个对象,除非它使用属性描述符传递第二个参数。


解释Object.createnew A之间的具体差异:

new A()

  • 创建一个继承自A.prototype
  • 的新对象
  • A应用于新对象,即致电A.call(newObj)

Object.create(A.prototype)

  • 创建一个继承自A.prototype
  • 的新对象

所以你看,这两个调用之间的具体区别在于new该函数应用于新对象,而Object.create则不是。


相关:Benefits of using `Object.create` for inheritance