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实例都将获得自己的实现sleep和eat方法.
在第二个模型中,所有实例将共享相同的sleep和eat方法实例.
第二个模型更好,因为我们可以共享方法.
正如Arun在第一个例子中提到的那样,你正在为每个新实例创建sleep和eat运行.在第二个例子中,只有一个sleep和eat函数在所有实例之间共享.
在这种情况下,第二种方法更好,但最好知道何时使用第一种方法以及何时使用第二种方法.首先是一点理论:
注意:有四种类型的变量在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