0

可能重复:
使用原型与直接在构造函数中定义方法的优势?

我试图掌握 JavaScript 中的原型属性,但我遇到了麻烦。

我遵循了一个教程,其中指出:

“所以所有对象都会自动共享 sayHello() 方法/函数,我们必须将它分配给 protoype 属性”。

现在提到的原始代码是:

function Pet(name, species, hello)
{
    this.name = name;
    this.species = species;
    this.hello = hello;
    this.sayHello = function()
    {
        alert(this.hello);
    }
}

修改后的使用原型属性:

function Pet(name, species, hello)
{
    this.name = name;
    this.species = species;
    this.hello = hello;
}

Pet.prototype.sayHello = function()
{
    alert(this.hello);
}

这里有什么区别,因为这两种方法都会产生相同的结果(据我所知)。例如,以下代码在与上述任一组合时的行为相同:

var rufus = new Pet("Rufus", "cat", "miaow");
rufus.sayHello();

在这两种情况下,都会发出“miaow”警报。

那么有人可以向我解释一下区别以及为什么您会选择其中一个吗?

4

1 回答 1

3

这是我最近发表的一篇文章这是一个演示。在演示中,查看链中的Test2位置foobar位置。

var Test2 = function() {              //foo attached via constructor
    this.foo = 'foo';                 //    each instance has "it's own" foo
}                    
Test2.prototype.bar = function() {};  //bar attached via prototype
                                      //    all instances "share" the same bar
var mytest2 = new Test2();

  (3) <-------- (2) <--------- (1) <- prototype chain
Object -> Test2 prototype -> mytest2
            '--> bar          '--> bar (from prototype)
                              '--> foo (from constructor)

基本上,通过构造函数附加的任何内容都会出现在每个实例中,但“属于该实例”。从实例修改该属性只会在当前实例处修改它。

另一方面,通过prototypeis 附加的那些出现在该对象的所有实例上并且是“共享的”。修改该属性会更改所有实例的该属性。

于 2012-05-24T10:44:46.553 回答