原型和方法 - 哪一个更受欢迎?

时间:2010-11-29 15:35:56

标签: javascript

为什么在js中使用原型用于优先考虑的方法?当我为两者创建一个新对象时,他们会做同样的事情吗?

function Rectangle(w, h) {
    this.width = w;
    this.height = h;
    this.area = function( ) { return this. width * this. height; }
}

Rectangle.prototype.area = function(){
    return this.width * this.height
}

2 个答案:

答案 0 :(得分:6)

有很大的不同。虽然在.area()实例上调用Rectangle时,两者(正如您定义的那样)将为您提供相同的返回值,但在第一个示例中,每个Rectangle对象都获得了它拥有<{1}}功能的副本。在第二种情况下,它们共享一个副本(更节省内存)。

哪个首选取决于您正在解决的问题。在您的示例中,几乎可以肯定地使用原型。这通常是你想要的方式。但是,如果您有一个area构造函数,并且永远不会有很多Foo个实例,那么您认为Foo真正私有是非常重要的数据,然后您可以使用private members idiom

Foo

这种模式利用了函数在构造函数中对function Foo() { var trulyPrivateVariable; this.getVar = function() { return trulyPrivateVariable; }; this.putVar = function(v) { // Presumably some logic or checks here trulyPrivateVariable = v; }; } 局部变量closures的事实。

但是,请记住,每个实例的那些函数都是重复的,所以这只适合审核。

值得注意的是,这些并非相互排斥。您可以点击上面的trulyPrivateVariable

Foo

...这样你就可以获得尽可能多的重用,只需将那些绝对需要访问Foo.prototype.doSomething = function() { // Do something completely unrelated -- note that code here // does not have access to `trulyPrivateVariable`, although it // will have access to `this.getVar()` and `this.putVar()` // (assuming it's called in the normal way). }; 的部分放在构造函数中,它们就会被重复。

偏离主题:为了简洁起见,我在上面使用了匿名函数(正如您所做的那样),但我在生产代码中not a fan of them

答案 1 :(得分:1)

使用原型是可取的。对于JS来说,存储哪些方法可用于“类”是一种更有效的方法。你应该看一些关于面向对象的javascript和原型继承的教程。