定义Javascript原型

Ric*_*ler 11 javascript oop prototype

以下两个Javascript原型之间有什么功能差异,选择一个原型有什么好处?

选项1:

Person.prototype.sayName = function(name) {
   alert(name);
}
Run Code Online (Sandbox Code Playgroud)

选项2:

Person.prototype = {
   sayName: function(name) {
      alert(name);
   }
}
Run Code Online (Sandbox Code Playgroud)

假设选项2导致某些隐含绑定到原型的函数被废弃,我是否正确?

Ber*_*rgi 6

假设选项2导致某些隐含绑定到原型的函数被废弃,我是否正确?

对,就是这样.虽然唯一隐含约束的属性是constructor属性,但您很少需要它.

有什么功能差异?

选项1只是扩展现有的原型.如果已经有Person从原型对象继承的实例,那么它们也可以使用该sayName方法.使用选项2,新原型将仅用于在覆盖后实例化的对象.

选择其中一个是否有任何好处?

这些应该是现在自我解释.选项1(扩展)被认为是更清晰的,如果您正在修改外来/未知/原生原型,则必须使用它.尽量避免选项2.

如果您仍然更喜欢对象文字语法,则应考虑使用Object.assign扩展现有原型:

Object.assign(Person.prototype, {
   sayName: function(name) {
      alert(name);
   }
});
Run Code Online (Sandbox Code Playgroud)

您可能需要填充工具Object.assign为ES6前环境.或者,$.extend或者_.extend也可以.当然,您最喜欢的库也带有辅助功能.

  • @AlexMills:因为您不需要知道原型上已经存在哪些属性,否则您会覆盖这些属性,并且不会破坏它们(无论在何处调用代码)。它更简单、不易出错并且向前兼容。当然,如果您从头开始创建原型对象,您也可以使用对象字面量,但即使如此,大多数人也会忘记标准的“构造函数”属性。 (2认同)