这个javascript原型模式有什么好处?

时间:2014-05-09 03:37:05

标签: javascript 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() {...};
}

当然,这种结构的好处是方法可以访问私有变量。

1 个答案:

答案 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?中得到了很好的介绍。