【发布时间】:2013-03-07 23:53:49
【问题描述】:
我想知道使用原型和不使用原型的重写方法有什么区别。考虑:
示例 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 类的 eat 方法。或者发生了什么不同的事情?
【问题讨论】:
-
在构造函数中定义对象的属性时,应该使用
this关键字。 -
@Sann 抱歉错过了 this 关键字。现在编辑问题。
-
将方法放在原型上几乎总是一个好主意,因为它们会在所有实例之间共享。将它们放在您的构造函数中会将它们复制到所有实例中,这会消耗更多内存。
-
那么除了内存问题,还有其他问题吗?
-
@DeepakMahalingam - 在构造函数中声明为
this属性的函数可防止构造函数的私有变量被垃圾收集,即使它们本身可能不会关闭任何私有变量。但是,由于这可以归类为 内存问题,我会说:不,没有其他问题。将方法放在prototype上只是一种流行的编码实践。
标签: javascript prototype overriding