MyClass.prototype = {}和MyClass.prototype.method之间的Javascript差异

cra*_*bus 5 javascript prototype

这是我长期以来一直想知道的一件事.但两者的第一个示例代码

A型

var JavaScriptClass = function () {

};


JavaScriptClass.prototype = {
    myMethodOne: function() {

    },

    myMethodTwo: function() {

    }
};
Run Code Online (Sandbox Code Playgroud)

B型

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支持)还是仅仅是"编码风格"的东西?

dol*_*ldt 3

有相当大的差异。

在类型 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