2010-12-30 13 views
0

代わりのcallメソッドを使用して、例えば、次のように利用する適用可能である:プロトタイプコンストラクタ呼び出し

var A = function(height,weight) { 
    this.height = height; 
    this.weight = weight; 
}; 

var a = new A("6ft","500lbs"); 

A.prototype.foo = { 
    setup: function() { 
     this.height.set(); 
     this.weight(); 
    }, 

    height: { 
     set: function() { 
      var constr = a; 
      var self = this; 

      console.log(constr); 
      console.log(self); 
     } 
    }, 

    weight: function() { 
     var constr = a; 
     var self = this; 

     (function() { 
      console.log(constr); 
     })(); 
    } 
}; 

a.foo.setup(); 

任意の提案を歓迎いたします。

乾杯

+1

あなたは何を達成しようとしていますか? –

+0

コール/適用メソッドを使用せずにコンストラクタからプロパティを継承する機能。 – domscripter

答えて

1

あなたはこれを行うことができますが、何が混乱しますか。 heightおよびweightは、2つの異なる意味を有する。 Aのすべてのインスタンスは、その最初のaを参照します。あなたは何を達成しようとしていますか?

編集:

プロトタイプを使用しての問題は1が作成されたときに、インスタンスに固有の機能のコンテキストは、典型的には、任意の前に、プロトタイプは一度だけ作成されていることを明白な理由のために(存在しない、ということです。。クラスのインスタンス文脈がなければ、インスタンスにプライベート変数を隠しておくする場所がありません、私が好む何を工事でメソッドを作成することです:

var A = function(height, weight) { 
    this.height = function() { return height; }; 
    this.weight = function() { return weight; }; 
}; 

は、プライベート(自身が共通を作成するプロトタイプを作成する機能を使用します、静的)コンテキストすべてインスタンス。あなたも、コンセプトを混在させることができます:

var A = function(height, weight) { 
    this.__init__(height, weight); 
}; 

A.prototype.__init__ = (function() { 
    // any variables declared here are private and static 
    var number_of_instances = 0; 
    return function(height, weight) { 
     // any variables declared here are private and NOT static 

     // as always, anything added to this are public and not static 
     this.getNumberOfInstances = function() { 
      return number_of_instances; 
     }; 

     this.height = function() { return height; }; 
     this.weight = function() { return weight; }; 
     number_of_instances++; 
    }; 
})(); 

私は、それはあなたが別のクラスから継承するように変更できなかったことを意味し、過書き込み全体プロトタイプをワクワクありませんよ。

+0

私はそうする必要があるときにコンストラクタのプロパティを呼び出す能力を達成しようとしています。さらに、公開/非公開のスコープを持つ機能が必要です。前述のコードブロックは、ストレステストの詳細です。 – domscripter

+0

ありがとうございます、あなたの例はうまく動作します!私は2つの質問が残っています:http://pastie.org/1418410 - var a = new A()のプレースメントに関して。たとえば、コンストラクタ関数の直後、またはファイル内のより低い位置に優先配置がありますか?また、ペストリーの例からは、どちらが一番良いのですか? – domscripter

+0

一般に、クラスを定義するコードは、論理モジュールまたはライブラリを形成するために、関連するクラスを定義するコードと共に保持される。コンストラクタは、インスタンスがインスタンス化されたときに呼び出されます。必要な場合はいつでも、通常は別のファイルに格納されていることがあります。ペストリーの例は、微妙に異なる方法ですべての種類が奇妙です。私は最初に素敵なきちんとしたAPIを設計し、それに合わせてコードを書くべきだと思います。ところで、StackOverflowエチケットのビット:私の答えが好きな場合は、星やupvote。 – Malvolio