2012-04-06 7 views
0

以下は、のアプリケーションの簡略化されたバージョンです。次のコードは意図したとおりに動作します。私はSayHelloに渡された引数で私のコンソールに4つのログを見ることができます。コンストラクタコールへのショートカット

var App = {}; 

(function(that){ 

    that.SayHello = function(){ 
     console.log(arguments); 
     return { 
      doSomething: function(){ 
       console.log('done'); 
      } 
     }; 
    }; 

    var obj = { 
     t: new that.SayHello('a', 1), 
     r: new that.SayHello('b', 2), 
     b: new that.SayHello('c', 3), 
     l: new that.SayHello('d', 4) 
    }; 

}(App)); 

問題:私は次のようにnew that.SayHelloに "ショートカット" を作成しようとしています

var Greet = function(){ 
     return new that.SayHello; 
    }, 
    obj = { 
     t: Greet('a', 1), 
     r: Greet('b', 2), 
     b: Greet('c', 3), 
     l: Greet('d', 4) 
    }; 

コンソールログ4つの空の配列。これは、argumentsが失敗したことを意味します。

return new that.SayHello.apply(this, arguments);return new that.SayHello.call(this, arguments);も試しました。

Greetargumentsthat.SayHelloに渡すにはどうすればよいですか?
new that.SayHelloを使用してthat.SayHelloを初期化する必要があることがわかっている場合は、コードが改行されます。

argumentsの任意の数の一般的な解決策を探していますが、argumentsを1つずつ渡したくありません。

このコードはjsfiddleでも利用できます。

答えて

1

これは何か?

var Greet = function(){ 
    var result = that.SayHello.prototype; 
    that.SayHello.apply(result, arguments); 
    return result; 
} 

あなたはapplyresultをオブジェクトへargumentsを適用することを知っている必要があります。事前にresultSayHelloプロトタイプとして定義すると、必要なものが得られます。

EDIT

Unfortunetly上記のコードはSayHelloのプロトタイプを変化させます。これは明らかに望ましくない動作ですので、これを避けるためにプロトタイプオブジェクトをコピーする必要があります。たとえば、次のコード

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 Greet = function(){ 
    var result = clone(that.SayHello.prototype); 
    that.SayHello.apply(result, arguments); 
    return result; 
} 

は、私がthis answerclone機能のこの単純なバージョンを見つけた使用します。それには多くの問題があり、他の答えをチェックする必要があります。たとえば、jQueryの$.extend({},originalObject)を使用するとよいでしょう。

あなたが連鎖するプロトタイプ(あなたが必要がありますが)気にしない場合は、常にこのような非常に単純なもの行うことができます注:古いブラウザ(ECMAScriptの5)気にしないのであれば

var Greet = function(){ 
    var result = {}; 
    that.SayHello.apply(result, arguments); 
    return result; 
} 

Object.createメソッドを使用できます。

var Greet = function(){ 
    var result = Object.create(that.SayHello.prototype); 
    that.SayHello.apply(result, arguments); 
    return result; 
} 
+0

正確にこのように!ありがとう! – Pierre

+0

@Pierre私の答えに大きなバグが1つありました。私はそれを更新しました。 – freakish

関連する問題