3

我想知道这两种方法有什么区别。它们都有效,但我不明白第二种方法是否会产生不良影响?

// A. Putting a prototype method outside the function declaration (what I would normally do)
var Cat = function(){
}

Cat.prototype.eat = function(){
    // implementation
}

// B. Putting a prototype method inside the function declaration (it works too but the scoping seems different)
var Cat = function(){

    Cat.prototype.eat = function(){
        // implementation
    }   
}
4

2 回答 2

4

你可能想做第一个例子。两者都在做完全相同的事情,尽管从技术上讲,第二个函数将可以访问 Cat 的“私有”变量。但是,如果您想这样做,正确的方法是使用this

var Cat = function(){
    var a = 'hi';

    this.eat = function() {
        alert(a); // Exists!
    }
}

请记住,对于上面的示例,或者对于您原来的“B”示例,eat 函数将不存在,直到您使用new Cat(). 意思是,如果您只想调用Cat.eat()函数本身,例如实用程序方法,那么第一个示例prototype就是要走的路。

于 2012-08-07T07:39:10.703 回答
1

每个对象都有一个原型。原型继承允许您分配一个全新的原型(类似于经典继承):

function Animal() {
    this.numLegs = 4;
}
function Cat() {
    // Implementation
}
Cat.prototype = new Animal();

var kitten = new Cat();
console.log(kitten.numLegs); // 4

或者直接在当前类的原型中添加变量和方法:

function Cat() {
    // Implementation
}
Cat.prototype.numLegs = 4;

var kitten = new Cat();
console.log(kitten.numLegs); // 4

您的第二个示例只是在eat每次Cat启动类时将函数重新分配给 Cat 原型,这是无用的,但不会占用任何内存,因为它只是覆盖了旧值。

为什么这很有用?请记住,函数是对象。对于类的每个实例,该类中定义的每个变量和函数都会占用它自己的内存。使用原型继承,您可以共享通用方法,从而不会为每个实例占用额外的内存。

为什么这不那么有用?您无权访问私有变量。

请记住,这与静态方法不同,可以将其声明为:

Cat.feed = function(kittens) {
    for (var kitten in kittens) {
        kitten.eat();
    }
};
于 2012-08-07T07:49:17.297 回答