在Javascript中覆盖方法

cod*_*ash 11 javascript overriding prototype

我想知道重写方法与原型和没有原型之间的区别.考虑:

例1:

function Animal() {
    this.sleep = function () {
        alert("animal sleeping");
    };

    this.eat = function () {
        alert("animal eating");
    };
}

function Dog() {
    this.eat = function () {
        alert("Dog eating");
    };
}

Dog.prototype = new Animal;

var dog = new Dog;

dog.eat();
Run Code Online (Sandbox Code Playgroud)

例2:

function Animal() { }

function Dog() { }

Animal.prototype.sleep = function () {
    alert("animal sleeping");
};

Animal.prototype.eat = function () {
    alert("animal eating");
};

Dog.prototype = new Animal;

Dog.prototype.eat = function () {
    alert("Dog eating");
};

var dog = new Dog;

dog.eat();
Run Code Online (Sandbox Code Playgroud)

我觉得这两个例子都产生了同样的效果,即Dog班级覆盖了班级的吃法Animal.或者有什么不同的事情发生?

Aru*_*hny 10

在第一种方法中,每个Animal实例都将获得自己的实现sleepeat方法.

在第二个模型中,所有实例将共享相同的sleepeat方法实例.

第二个模型更好,因为我们可以共享方法.


Aad*_*hah 8

正如Arun在第一个例子中提到的那样,你正在为每个新实例创建sleepeat运行.在第二个例子中,只有一个sleepeat函数在所有实例之间共享.

在这种情况下,第二种方法更好,但最好知道何时使用第一种方法以及何时使用第二种方法.首先是一点理论:

注意:有四种类型的变量在JavaScript中- ,,private 和.publicsharedstatic

私有变量在定义它们的函数之外是不可访问的.例如:

function f() {
    var x; // this is a private variable
}
Run Code Online (Sandbox Code Playgroud)

公共变量是在this函数内的对象上定义的.例如:

function f() {
    this.x; // this is a public variable
}
Run Code Online (Sandbox Code Playgroud)

共享变量prototype在函数上共享.例如:

function f() {}

f.prototype.x; // this is a shared variable
Run Code Online (Sandbox Code Playgroud)

静态变量是函数本身的属性.例如:

function f() {}

f.x; // this is a static variable
Run Code Online (Sandbox Code Playgroud)

大多数情况下,最好将构造函数的方法声明为共享方法,因为构造函数的所有实例都共享它们.但是,如果您的方法需要访问私有变量,则必须将其声明为公共方法本身.

注意:这是我自己的命名法.没有多少JavaScript程序员遵守它.其他人似乎遵循Douglas Crockford的命名法:http://javascript.crockford.com/private.html

要了解有关JavaScript中原型继承的更多信息,请阅读以下答案:https://stackoverflow.com/a/8096017/783743