在Javascript重写方法(Overriding methods in Javascript)

2019-07-21 23:22发布

我想知道什么是有原型和无原型压倒一切的方法之间的差异。 考虑:

实施例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();

实施例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();

我觉得这两个例子中产生了同样的效果Dog类重载的方法吃Animal类。 或者是有什么不同的事情发生?

Answer 1:

在第一种方法各的Animal实例将获得自己的执行sleepeat的方法。

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

第二种模式是更好,因为我们可以分享的方法。



Answer 2:

由于阿伦在第一个例子中提到你正在创建sleepeat的功能为每一个新实例。 在第二示例中,只有一个sleepeat其所有的实例之间共享的功能。

在这种情况下,第二种方法比较好,但它的好,知道什么时候使用第一种方法,当使用第二。 理论的一点点第一:

注意:有四种类型的变量在JavaScript中- privatepublicsharedstatic

私有变量是不可访问,其中定义它们的功能之外。 例如:

function f() {
    var x; // this is a private variable
}

公共变量在定义this函数内部对象。 例如:

function f() {
    this.x; // this is a public variable
}

共享变量上的共享prototype的功能。 例如:

function f() {}

f.prototype.x; // this is a shared variable

静态变量的函数本身的性质。 例如:

function f() {}

f.x; // this is a static variable

大多数情况下,最好声明构造函数的方法,为共享方法,因为构造函数的所有实例共享。 但是,如果你的方法需要访问私有变量,那么它必须被声明为public方法本身。

注:这是我自己命名。 没有多少JavaScript程序员坚持下去。 其他人似乎遵循道格拉斯Crockford的命名: http://javascript.crockford.com/private.html

要了解更多关于在JavaScript原型继承阅读以下答案: https://stackoverflow.com/a/8096017/783743



Answer 3:

在你的第一个例子中,每个新的Dog实例都会有它自己eat方法,并在第二个例子中会出现只有一个eat的方法Dog.prototype ,将所有未来实例之间共享Dog像阿伦提及。

这是这两个之间的唯一的“刁钻”的区别。 但它总是更好地界定在方法prototype ,以避免高内存消耗和泄漏。



Answer 4:

在第一示例中的方法在对象实例定义。

你的设置Dog原型到一个新的Animal的实例,因此Dog将继承sleepeat从功能Animal 。 然后,你定义 (不重写eat的方法Dog构造函数实例方法,这将隐藏继承eat的方法Dog的情况。

请看下面的例子:

function LittleDog() { }
LittleDog.prototype = Object.create(Dog.prototype);
(new LittleDog()).eat();

上面的代码会提醒animal eating ,在第一个例子代码。

并会提醒Dog eating ,在第二个代码。



文章来源: Overriding methods in Javascript