如果你跳到this question中的第一个答案,你会看到他使用Employee.prototype = new Person();
继承Person.prototype
到Employee.prototype
,但当我了解JavaScript OOP课程时来自Udacity,他们使用了Employee.prototype = Object.create(Person.prototype);
代替。
什么是正确的:
Employee.prototype = new Person();
或
Employee.prototype = Object.create(Person.prototype);
或
Employee.prototype = Person.prototype;
如果这个问题重复,请给我一些好的答案。
答案 0 :(得分:2)
Employee.prototype = Object.create(Person.prototype);
是最干净的。
使用Employee.prototype = new Person();
,您会发现this
中Person
的分配会影响您的所有Employee
个实例。也许你不想那样。也可能有其他副作用。
例如(使用一些ES2015语法):
function Person(name = "fred") {
this.name = name;
}
function Employee(...args) {
Person.call(this, ...args);
}
Employee.prototype = new Person();
var e1 = new Employee();
console.log(e1.name); // fred
您需要阅读Person
代码,以了解默认情况下为什么所有员工都被调用fred
。在这种情况下,这是微不足道的,但在现实世界中,许多功能都很长且有状态,容易被误读。
想象一下,Person
是否取决于某些外部状态。 Employee.prototype
的值可能会根据某些其他代码是否已执行而发生变化。您不希望原型链中存在这种不确定性。
例如:
let personCount = 0;
function Person() {
this.id = personCount ++;
}
// ...
Employee.prototype = new Person();
// what `id` do Employees inherit? we don't know!
// it depend on how many times `Person` has been called,
// and by creating `Employee.prototype` we changed the state even further. Uhoh.
Object.create(Person.prototype)
更容易推理,因为没有用户函数调用;没有逻辑。您只需要检查静态Person.prototype
以查看您继承的内容。
原型仍然可能具有可变值,因此存在一些不确定性,但创建对象本身的行为没有副作用,所以这种bug不太可能发生。< / p>
使用Employee.prototype = Person.prototype;
,对Employee.prototype
的更改将影响所有Person
个实例。你可能不希望这样。