请找到我创建继承的两种方法。有人可以解释一下每种类型的情况。
方法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");
方法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");
我已经插入了每个对象的控制台图像。在第一种方法中,我可以在人类中看到未定义的名称属性(请参阅第一个屏幕截图)。
但是在第二种继承方法的情况下,人类中没有名称属性。
有人可以深入解释这种行为以及背景中发生的事情。
答案 0 :(得分:1)
这里没有任何神奇的东西,程序正在按照它所要做的去做。
当您致电new Person
时,您正在创建一个新对象。该对象具有name
属性,因为您在函数内明确指定this.name
。
Object.create
会创建一个空对象,除非它使用属性描述符传递第二个参数。
解释Object.create
和new A
之间的具体差异:
new A()
:
A.prototype
A
应用于新对象,即致电A.call(newObj)
Object.create(A.prototype)
:
A.prototype
所以你看,这两个调用之间的具体区别在于new
该函数应用于新对象,而Object.create
则不是。