当前位置 : 主页 > 大数据 > 区块链 >

MyClass.prototype = {}和MyClass.prototype.method之间的Javascript区别

来源:互联网 收集:自由互联 发布时间:2021-06-22
参见英文答案 Defining a Javascript prototype5个 这是我长期以来一直想知道的一件事.但两者的第一个示例代码 A型 var JavaScriptClass = function () {};JavaScriptClass.prototype = { myMethodOne: function() { }, m
参见英文答案 > Defining a Javascript prototype                                    5个
这是我长期以来一直想知道的一件事.但两者的第一个示例代码

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 with Object.getPrototypeOf). The actual prototype of a constructor is Function.prototype since constructors are functions. Its prototype property will be the prototype of instances created through it but is not its own prototype.

网友评论