我看到一些代码以这种方式定义原型中的方法:
function Class() {...}
(function() {
this.method1 = function() {...};
this.method2 = function() {...};
}).call(Class.prototype);
这种结构与其他结构有什么好处?以下是其他一些例子:
function Class() {...}
Class.prototype = {
method1: function() {...},
method2: function() {...}
};
或
function Class() {...}
Class.prototype.method1 = function() {...};
Class.prototype.method2: function() {...};
或
function Class() {...}
Class.prototype = Object.create({...}, {...});
Class.prototype.constructor = Class;
以下我知道在内存方面效率稍低,因为每个实例都有自己的method1和method2副本:
function Class() {
var privateVar = 0;
this.method1 = function() {...};
this.method2 = function() {...};
}
当然,这种结构的好处是方法可以访问私有变量。
答案 0 :(得分:1)
片段#1和#3做同样的事情。第一个好处是您不需要重复Class.prototype.
,甚至可能定义静态“类本地”变量。但是,.call
的使用是不常见的,大多数使用名为proto
左右的简单参数:
function Class() {...}
(function(p) {
p.method1 = function() {...};
p.method2 = function() {...};
}(Class.prototype));
Defining a Javascript prototype中介绍了此单个属性分配与代码片段#2的区别。
#4的代码片段对你的使用{...}
有点不清楚。但是,Object.create
通常用于inheritance between classes。
原型方法和特定于实例的方法(代码段#5)之间的区别在Use of 'prototype' vs. 'this' in JavaScript?中得到了很好的介绍。