我看到一些代码以这种方式定义了原型(prototype)中的方法:
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() {...};
}
当然,这种构造的好处是方法可以访问私有(private)变量。
最佳答案
片段#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 .
Use of 'prototype' vs. 'this' in JavaScript? 中详细介绍了原型(prototype)方法和实例特定方法之间的区别(片段 #5) .
关于javascript - 这个 javascript 原型(prototype)模式有什么好处?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23556185/