如何 - 正确 - 委托类原型

时间:2016-10-20 21:21:15

标签: javascript class oop

如果你跳到this question中的第一个答案,你会看到他使用Employee.prototype = new Person();继承Person.prototypeEmployee.prototype,但当我了解JavaScript OOP课程时来自Udacity,他们使用了Employee.prototype = Object.create(Person.prototype); 代替。 什么是正确的:

Employee.prototype = new Person();

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

Employee.prototype = Person.prototype;

如果这个问题重复,请给我一些好的答案。

1 个答案:

答案 0 :(得分:2)

Employee.prototype = Object.create(Person.prototype);是最干净的。

使用Employee.prototype = new Person();,您会发现thisPerson的分配会影响您的所有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个实例。你可能不希望这样。