我想知道什么是有原型和无原型压倒一切的方法之间的差异。 考虑:
实施例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
类。 或者是有什么不同的事情发生?
在第一种方法各的Animal
实例将获得自己的执行sleep
和eat
的方法。
而在第二个模型中的所有实例将共享相同的实例sleep
和eat
的方法。
第二种模式是更好,因为我们可以分享的方法。
由于阿伦在第一个例子中提到你正在创建sleep
和eat
的功能为每一个新实例。 在第二示例中,只有一个sleep
和eat
其所有的实例之间共享的功能。
在这种情况下,第二种方法比较好,但它的好,知道什么时候使用第一种方法,当使用第二。 理论的一点点第一:
注意:有四种类型的变量在JavaScript中- private
, public
, shared
和static
。
私有变量是不可访问,其中定义它们的功能之外。 例如:
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
在你的第一个例子中,每个新的Dog
实例都会有它自己eat
方法,并在第二个例子中会出现只有一个eat
的方法Dog.prototype
,将所有未来实例之间共享Dog
像阿伦提及。
这是这两个之间的唯一的“刁钻”的区别。 但它总是更好地界定在方法prototype
,以避免高内存消耗和泄漏。
在第一示例中的方法在对象实例定义。
你的设置Dog
原型到一个新的Animal
的实例,因此Dog
将继承sleep
和eat
从功能Animal
。 然后,你定义 (不重写 ) eat
的方法Dog
构造函数实例方法,这将隐藏继承eat
的方法Dog
的情况。
请看下面的例子:
function LittleDog() { }
LittleDog.prototype = Object.create(Dog.prototype);
(new LittleDog()).eat();
上面的代码会提醒animal eating
,在第一个例子代码。
并会提醒Dog eating
,在第二个代码。