1

私はjavascriptの継承にあまり精通しておらず、あるオブジェクトを別のオブジェクトから継承させ、独自のメソッドを定義しようとしています。

function Foo() {}
Foo.prototype = {
    getColor: function () {return this.color;},
};
function FooB() {}
FooB.prototype = new Foo();
FooB.prototype = {
    /* other methods here */
};

var x = new FooB().getColor();

ただし、2番目のものは最初のもの(FooB.prototype = new Foo() is cancelled out)を上書きします。この問題を解決する方法はありますか、それとも間違った方向に進んでいますか?

よろしくお願いします。悪い用語でごめんなさい。

4

3 に答える 3

6

各オブジェクトは1つのプロトタイプしか持てないため、継承(コピー)後にプロトタイプに追加する場合は、新しいプロトタイプを割り当てるのではなく、拡張する必要があります。例:

function Foo() {}

Foo.prototype = {
    x: function(){ alert('x'); },
    y: function(){ alert('y'); }
};

function Foo2() {}

Foo2.prototype = new Foo();
Foo2.prototype.z = function() { alert('z'); };

var a = new Foo();
a.x();
a.y();
var b = new Foo2();
b.x();
b.y();
b.z();
于 2011-01-20T11:29:17.060 に答える
2

1つの解決策は次のとおりです。

function FooB() {}
var p = new Foo();
p.methodA = function(){...}
p.methodB = function(){...}
p.methodC = function(){...}
...

FooB.prototype = p;

更新:既存のオブジェクトでの拡張について。あるオブジェクトの既存のプロパティを別のオブジェクトにいつでもコピーできます。

FooB.prototype = new Foo();
var proto = {
     /*...*/
};

for(var prop in proto) {
    FooB.prototype[prop] = proto[prop];
}

proto「プレーン」オブジェクト(つまり、別のオブジェクトから継承しない)である限り、問題ありません。それ以外if(proto.hasOwnProperty(prop))の場合は、継承されていないプロパティのみを追加するように追加することをお勧めします。

于 2011-01-20T11:24:56.677 に答える
2

extend新しいメンバーをプロトタイプオブジェクトにコピーする関数を使用できます。

function FooB() {}
FooB.prototype = new FooA();

extend(FooB.prototype, {
    /* other methods here */
});

拡張する

/**
 * Copies members from an object to another object.
 * @param {Object} target the object to be copied onto
 * @param {Object} source the object to copy from
 * @param {Boolean} deep  whether the copy is deep or shallow
 */
function extend(target, source, deep) {
    for (var i in source) {
        if (deep || Object.hasOwnProperty.call(source, i)) {
            target[i] = source[i];
        }
    }
    return target;
}
于 2011-01-20T12:33:36.000 に答える