JavaScript中的构造函数和继承
这是关于JavaScript中的“继承” 假设我创建了一个构造器Bird(),以及另一个名为Parrot()的构造器,通过将Bird的实例分配给Parrot的原型来“继承”Bird的属性,如下代码所示:JavaScript中的构造函数和继承,javascript,oop,inheritance,prototype,Javascript,Oop,Inheritance,Prototype,这是关于JavaScript中的“继承” 假设我创建了一个构造器Bird(),以及另一个名为Parrot()的构造器,通过将Bird的实例分配给Parrot的原型来“继承”Bird的属性,如下代码所示: function Bird() { this.fly = function(){}; } function Parrot() { this.talk = function(){ alert("praa!!"); }; } Parrot.prototype = new Bird(
function Bird() {
this.fly = function(){};
}
function Parrot() {
this.talk = function(){ alert("praa!!"); };
}
Parrot.prototype = new Bird();
var p = new Parrot();
p.talk(); // Alerts "praa!!"
alert(p.constructor); // Alerts the Bird function!?!?!
创建Parrot实例后,为什么它的.constructor属性是Bird(),而不是Parrot(),Parrot()是我用来创建对象的构造函数?构造函数指的是创建实例的原型的函数(而不是实例).原型是一个对象,就像JavaScript中的其他任何东西一样,对象分配是通过引用进行的。您刚刚为parrot的原型指定了一个新的鸟,因此parrot的原型现在是一个鸟实例。鸟的构造器是鸟 你可以用电话线来解决这个问题
Parrot.prototype.constructor = Parrot;
另一种方法是将鸟的原型克隆给Parrot.prototype
function deepClone(obj) {
var clone = {};
for(var i in obj) {
if(typeof(obj[i])==="object") {
clone[i] = deepClone(obj[i]);
} else {
clone[i] = obj[i];
}
}
return clone;
}
Parrot.prototype = deepClone(Bird.prototype);
Parrot.prototype.constructor = Parrot;
我更喜欢这样,因为:
1) 它省去了创建任意一个bird实例的麻烦(如果有什么东西正在计数,那么创建了多少只bird呢)
2) 如果Bird构造函数接受了在构造函数体中测试过的参数,该怎么办?然后
电话:
Parrot.prototype = new Bird();
然后可能导致在现代Firefox、Chrome、IExplorer和Safari中测试的空指针,结果相同…:呸!我终于明白了:p Parrot.prototype,一个已经定义了.constructor(等于Bird)的Bird实例,在Parrot中用于创建新实例。我觉得奇怪的是,构造函数不是自动重写的。不管怎么说,知道了它就很容易解决了(就像你建议的那样)。谢谢!