以下两个JavaScript原型之间的功能区别是什么?选择一个与另一个原型有什么好处?
选项1:
Person.prototype.sayName = function(name) { alert(name); }
选项2:
Person.prototype = { sayName: function(name) { alert(name); } }
我是否假设 选项2 导致废弃某些隐式绑定到原型的函数是否正确?
我是否假设选项2导致废弃某些隐式绑定到原型的函数是否正确?
对,就是这样。尽管唯一隐式绑定的属性是constructor您很少需要的属性。
constructor
功能上有什么区别?
选项1只是扩展现有的原型。如果已经有Person从原型对象继承的实例,则它们也将能够使用该sayName方法。使用选项2,新的原型仅用于覆盖后实例化的对象。
Person
sayName
选择其中一个有什么好处吗?
这些现在应该是不言自明的。选项1(扩展)被认为更干净,如果要修改外部/未知/本地原型,则必须这样做。尽量避免选择2。
如果您仍然更喜欢对象文字语法,则应考虑使用Object.assign扩展现有原型:
Object.assign
Object.assign(Person.prototype, { sayName: function(name) { alert(name); } });
您可能需要填充工具Object.assign预ES6环境。或者,$.extend也可以_.extend工作。当然,您最喜欢的库也为此提供了一个辅助函数。
$.extend
_.extend