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

3

我看到一些代码使用这种方式在原型中定义方法:

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() {...};
}

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

第一和第三个是相同的,第二和第四个也是相同的,假设你在第四个中传递了 Object.prototype 并且传递了具有相同属性描述符的方法。*(第四个还将 .constructor 添加回去,而第二个则没有)*。最后一个不使用继承。第一/第三和第二/第四之间的区别很小。 - cookie monster
我认为前四个例子中没有任何实质性的好处,因为它们几乎是相同的。更重要的是要理解语法的作用,以便您可以自己做出判断。 - cookie monster
1个回答

1
代码片段 #1 和 #3 做了同样的事情。第一个的好处是你不需要重复 Class.prototype.,甚至可以定义静态的“类局部”变量。然而,使用 .call 是不常见的,通常只使用一个名为 proto 的简单参数。
function Class() {...}
(function(p) {
    p.method1 = function() {...};
    p.method2 = function() {...};
}(Class.prototype));

这个单独属性赋值和代码片段#2的区别在定义Javascript原型中有所涉及。
代码片段#4的作用由于使用了{...}而有些不清晰。然而,Object.create通常用于类之间的继承
原型方法和实例特定方法(代码片段#5)的区别在JavaScript中使用'prototype'与'this'中得到了很好的涵盖。

非常好的回答。谢谢! - unional

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接