Javascript与继承

Javascript与继承,javascript,Javascript,假设我有一门课: 我希望其他对象从中继承变量和函数 function Bar(){} function Baz(){} 然后实例化我的对象: var bar = new Bar(); bar.foo1 // returns null bar.foo2() // returns false 在Bar和Baz中包含Foo的正确功能是什么 我已经做了Bar.prototype=newfoo()但在我们喜爱的IE上似乎失败了(如果您将所有属性附加到原型上(至少对于方法来说,这是更好的) 然后将

假设我有一门课:

我希望其他对象从中继承变量和函数

function Bar(){}
function Baz(){}
然后实例化我的对象:

var bar = new Bar();
bar.foo1   // returns null
bar.foo2() // returns false
Bar
Baz
中包含
Foo
的正确功能是什么



我已经做了
Bar.prototype=newfoo()但在我们喜爱的IE上似乎失败了(如果您将所有属性附加到原型上(至少对于方法来说,这是更好的)

然后将父对象的原型分配给子对象的原型就足够了:

function inherit(Child, Parent) {
    var Tmp = function(){};
    Tmp.prototype = Parent.prototype;
    Child.prototype = new Tmp();
    Child.prototype.constructor = Child;
}

inherit(Bar, Foo);
在这里,我们使用了一个中间构造函数来“解耦”两个原型。否则,如果你改变一个,你也会改变另一个(因为它们引用相同的对象)。这种方法实际上非常流行,并且被几个库使用

如果没有,则必须在子构造函数中调用父构造函数:

function Bar() {
    Foo.call(this);
}
这是您应该经常做的事情,将构造函数中设置的属性分配给当前对象


另外一句话:

Bar.prototype = new Foo();
这应该是可行的(实际上在IE中也是如此),但它有两个主要缺陷:

  • Foo
    中设置的所有实例属性将成为所有
    Bar
    实例共享的属性

  • 如果
    Foo
    需要一些只有在创建
    Bar
    实例时才可用的参数,该怎么办

如果您喜欢Ruby并希望获得更完整的解决方案,请查看或。这些库可以帮助您在javascript中面向对象,并向开发人员隐藏原型


希望这有帮助

这绝对不是一个独特的问题。
function Bar() {
    Foo.call(this);
}
Bar.prototype = new Foo();