2
var a = function(){
    this.sayFoo = function(){
        console.log('foo');
    };
}

var b = function(){
    console.log(this.prototype); //undefined
    this.sayBar = function(){
        console.log('bar');
    };
}

b.prototype = new a();

var bInst = new b();

bInst.sayFoo();
bInst.sayBar();

console.log(b.prototype); //a {sayFoo: function}

http://jsfiddle.net/KbBny/1/

関数コンストラクター内のプロトタイプに追加sayBarするにはどうすればよいですか?b

プロトタイプを上書きしますかb.prototype = new a();、それとも を とマージしbますaか?

4

3 に答える 3

2

正しい継承パターンを使用していません。

使用する:

b.prototype = Object.create(a.prototype);

あなたの場合、単純なオーバーライドを実行していますが、継承を正しく確立していません。Object.createはES5ですが、これでポリフィルできます:

Object.create

if (!Object.create) {
    Object.create = function (o) {
        if (arguments.length > 1) {
            throw new Error('Object.create implementation only accepts the first parameter.');
        }
        function F() {}
        F.prototype = o;
        return new F();
    };
}

プロトタイプへのアクセス

prototype定義ブロック内にはアクセスできません。あなたはそのためのthis参照を持っています。

var b = function() {
    a.call(this);
    b.prototype.doSomething = function() {console.log("b");}; 
};
b.prototype = Object.create(a.prototype);

デモ

于 2013-05-16T08:34:49.760 に答える