为什么在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
}
答案 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和原型继承的教程。