这是关于 JavaScript 中的“继承”。
假设我创建一个构造函数 Bird() 和另一个名为 Parrot() 的构造函数,通过将 Bird 的实例分配给 Parrot 的原型来“继承”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()?
原型是一个对象,就像 JavaScript 中的其他对象一样,对象分配是通过引用进行的。您刚刚为 parrot 的原型分配了一只新鸟,因此 parrot 的原型现在是一个鸟实例。鸟的构造函数是 Bird。
你可以用以下行解决这个问题
Parrot.prototype.constructor = Parrot;
另一种方法是将 Bird 原型的克隆分配给 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)它节省了创建任意鸟的实例(如果有东西正在计算已经创建了多少只鸟怎么办)
2) 如果 Bird 构造函数采用在构造函数主体中测试过的参数怎么办?然后
呼叫:
Parrot.prototype = new Bird();
然后可能会导致空指针
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)