这是我长期以来一直想知道的一件事.但两者的第一个示例代码
A型
var JavaScriptClass = function () { }; JavaScriptClass.prototype = { myMethodOne: function() { }, myMethodTwo: function() { } };
B型
var JavaScriptClass = function () { }; JavaScriptClass.prototype.myMethodOne = function(){ }; JavaScriptClass.prototype.myMethodTwo = function(){ };
我在许多教程,示例和库中都看到了(主要的A类在旧版本中).
对我来说,特别是在大型课程中使用Type A更为舒适,因为你必须编写更少的代码.但据我所知,coffeescript的编译器将Class语句编译为Type B.
类型A和B之间是否存在相当大的差异(例如,性能,继承的优势或更好的IDE支持)或者这只是“编码风格”的事情?
有很大的不同.在类型A中,您要重新分配函数的prototype属性,在类型B中,您要扩展它(通过重新分配某些方法).如果没有其他人触及原型,这就不会有什么不同,但实际上函数默认带有prototype属性.
试试这个:输入控制台
var a=function(){console.log(123);};
然后访问这个新创建的函数的原型:
a.prototype;
在浏览器环境中,这会使用构造函数和__proto__属性记录对象.如果你做类型A,a.prototype将完全是你的对象,在类型B中,你用方法myMethodOne和myMethodTwo扩展这个对象.
至于实际差异(当你想把这个函数用作构造函数时,它主要起作用),特别是为什么函数有一个默认的原型属性(不要与原型链上的原型混淆)创建函数),让我引用Eloquent Javascript, chapter 6:
It is important to note the distinction between the way a prototype is associated with a constructor (through its
prototype
property) and the way objects have a prototype (which can be retrieved withObject.getPrototypeOf
). The actual prototype of a constructor isFunction.prototype
since constructors are functions. Itsprototype
property will be the prototype of instances created through it but is not its own prototype.