JavaScript中的构造函数和继承

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(

这是关于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(),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中用于创建新实例。我觉得奇怪的是,构造函数不是自动重写的。不管怎么说,知道了它就很容易解决了(就像你建议的那样)。谢谢!