3

ベース オブジェクトからインスタンス プロパティを継承またはコピーする一連のオブジェクトを作成したいと考えています。これにより、どのパターンを使用するかについての決定に至りました。どの方法が「より良い」かについて、ご意見をお聞きしたいと思いました。

//APPLY:
// ---------------------------------------------------------
//base object template
var base = function(){
   this.x = { foo: 'bar'};
   this.do = function(){return this.x;}
}

//instance constructor
var instConstructor = function (a,b,c){
   base.apply(this);//coerces context on base
   this.aa = a;
   this.bb = b;
   this.cc = c;
}

instConstructor.prototype = new base();

var inst = function(a,b,c){
    return new instConstructor(a,b,c);
}

//CLONE   
// --------------------------------------------------------- 
function clone(obj) {
    if (null == obj || "object" != typeof obj) return obj;
    var copy = obj.constructor();
    for (var attr in obj) {
        if (obj.hasOwnProperty(attr)) copy[attr] = obj[attr];
    }
    return copy;
}    

var x = {foo: 'bar'};

function instC(a,b,c){
     this.aa = a;
     this.bb = b;
     this.cc = c;
     this.x = clone(x);
};

instC.prototype.do = function(){
    return this.x;
}

どちらも同じことを達成します。つまり、共通のテンプレートに基づく一意のインスタンス プロパティです。問題は、どちらがより「エレガント」かということです。

4

2 に答える 2

2

質問の音からすると、 Object.createに似たものを探しているようです。この関数を使用して、選択したオブジェクトをプロトタイプとして持つ新しいオブジェクトを作成できます。

//for old browsers without Object.create:
var objCreate = function(proto){
    function F(){};
    F.prototype = proto;
    return new F();

クローン方式との比較ですが、やり方が違うので、どちらがより適切かを選択する必要があります。

プロトタイプを使用すると、親オブジェクトの変更が子オブジェクトに反映されます。

a = {x:1};
b = Object.create(a);
a.x = 2;
//b.x is now 2 as well

を持つメソッドの使用にも注意する必要がありますthis。何をするかによっては、プロトタイプの継承を使いすぎると、望ましくない結果が生じる可能性があります。

a ={
   x: 1,
   foo: function(){ this.x += 1 }
}
b = Object.create(a);
b.foo();
//a.x does not change

一方、クローンを作成するとクローンが作成されるため、オブジェクトが互いに干渉しないことを確認できます。時々これはあなたが望むものです。

于 2011-11-10T11:02:51.480 に答える
0

わかりましたので、これについてさらに考えてみました。答えはユースケースに由来します。clone が特定のスコープにプロパティをコピーする場合、 apply はプロパティを囲むスコープを変更します。前者はミックスインに適しており、後者は継承に適しています。

于 2011-11-14T20:44:43.730 に答える