Javascript 原型和方法-首选哪一种?

Javascript 原型和方法-首选哪一种?,javascript,Javascript,为什么在js中使用prototype方法更可取?当我为两者创建一个新对象时,它们会做相同的事情吗 function Rectangle(w, h) { this.width = w; this.height = h; this.area = function( ) { return this. width * this. height; } } 或 最好使用原型。JS存储“类”可用的方法是一种更有效的方法。您应该看一些关于面向对象javascript和原型继承的教程。有

为什么在js中使用prototype方法更可取?当我为两者创建一个新对象时,它们会做相同的事情吗

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


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

有很大的不同。尽管在对
矩形
实例调用
.area()
时,这两个对象(正如您定义的那样)都会给您相同的返回值,但在第一个示例中,每个
矩形
对象都会获得其自己的区域函数的副本。在第二种情况下,它们都共享一个副本(这更节省内存)

选择哪一个在很大程度上取决于你正在解决的问题。在您的示例中,几乎可以肯定使用原型。这通常是你想要走的路。但是,如果您有一个
Foo
构造函数,并且不会有太多的
Foo
实例您认为
Foo
拥有真正的私有数据至关重要,那么您可以使用:

此模式利用了函数位于构造函数中的
trulyprovatevariable
局部变量之上这一事实

不过,请再次记住,这些函数对于每个实例都是重复的,因此这只是适度的

值得注意的是,这些并不是相互排斥的。您可以通过以下操作继续上面的
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).
};
…因此,只需将绝对需要访问
trulyprovatevariable
的部分放在构造函数中,即可获得尽可能多的重用


题外话:为了简洁起见,我在上面一直使用匿名函数(和你一样),但我使用的是生产代码。

当你说“在第二种情况下,它们都共享一个副本(内存效率更高)”,这是否意味着矩形的所有新对象的区域都是相同的?@steve:不,当然不是。:-)函数本身是共享的,但它所操作的数据(
值)将特定于每个实例。因此,由于
area
计算
this.width*this.height
,它将返回给定实例的正确值。冒着过度链接到我可怜的贫血博客的风险,你可能会发现另外两篇文章很有用:@steve:不用担心。我澄清了(我希望)答案开头一段中的语言。是的,我不得不考虑一下,但你的解释现在有意义了!:)
function Foo() {
    var trulyPrivateVariable;

    this.getVar = function() {
        return trulyPrivateVariable;
    };
    this.putVar = function(v) {
        // Presumably some logic or checks here
        trulyPrivateVariable = v;
    };
}
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).
};