cra*_*bus 5 javascript prototype
这是我长期以来一直想知道的一件事.但两者的第一个示例代码
var JavaScriptClass = function () {
};
JavaScriptClass.prototype = {
myMethodOne: function() {
},
myMethodTwo: function() {
}
};
Run Code Online (Sandbox Code Playgroud)
var JavaScriptClass = function () {
};
JavaScriptClass.prototype.myMethodOne = function(){
};
JavaScriptClass.prototype.myMethodTwo = function(){
};
Run Code Online (Sandbox Code Playgroud)
我在许多教程,示例和库中都看到了(主要的A类在旧版本中).
对我来说,特别是在大型课程中使用Type A更为舒适,因为你必须编写更少的代码.但据我所知,coffeescript的编译器将Class语句编译为类型B.
类型A和B之间是否存在相当大的差异(例如,性能,继承的优势或更好的IDE支持)还是仅仅是"编码风格"的东西?
有相当大的差异。
在类型 A 中,您要重新分配函数的原型属性,在类型 B 中,您要扩展它(通过重新分配某些方法)。如果没有其他人接触原型,这不会有什么不同,但实际上函数默认带有原型属性。
试试这个:在控制台中输入
var a=function(){console.log(123);};
Run Code Online (Sandbox Code Playgroud)
然后访问这个新创建的函数的原型:
a.prototype;
Run Code Online (Sandbox Code Playgroud)
在浏览器环境中,这会记录一个带有 a constructor 和 a__proto__属性的对象。如果您使用 A 型,a.prototype 将完全成为您的对象,而在 B 型中,您将使用方法myMethodOne和来扩展该对象myMethodTwo。
至于实际差异(当您想将此函数用作构造函数时,这主要发挥作用),特别是关于为什么函数根本具有默认原型属性(不要与原型链上的原型混淆)创建函数),让我引用Eloquent Javascript,第 6 章:
重要的是要注意原型与构造函数关联的方式(通过其属性)和对象具有
prototype原型的方式(可以使用 检索)之间的区别。构造函数的实际原型是因为构造函数是函数。它的属性将是通过它创建的实例的原型,但不是它自己的原型。Object.getPrototypeOfFunction.prototypeprototype