2016-04-04 18 views
1

私は多くのメソッドを持つオブジェクトを作成し、ファイルが非常に長くなるのを避けようとしています。問題は、オブジェクト内の他の情報を参照するメソッドの一部です。私はこのような何かをできるようにしたいと思います:ファイル間で 'これ'を共有する

index.js

var User = function(first, last){ 
    this.firstname = first; 
    this.lastname = last; 
}; 

User.prototype.name = require('./methods/name.js') 

方法/ name.js

module.exports = { 
    full: function(){ 
     return this.firstname + " " + this.lastname; 
    }, 
    formal: function(){ 
     return "Mr. " + this.lastname; 
    } 
}; 

thisはこの中では動作しませんなぜそれが理にかなっています状況が、他のファイルを参照できる別の解決方法がありますか?私が考えることができるのは、fsとrequireの代わりにeval()を使用しているということだけですが、それは私のハック、または長いファイルを持っていることの明白なようです。何か良いことがありますか?

プロトタイプに約35個のオブジェクトがあり、それぞれに平均4つのメソッドがあることを計画しています。提案?ありがとう。

バインドこのように、これらの機能あなたができる
+3

index.js //

モジュラーコードを維持する必要があります。プロトタイプ上にオブジェクトをネストすることはできません。 'this'は常にインスタンス内ではなくチェーン内の最後のオブジェクトを参照します。 – Bergi

+0

単に 'require'の代わりにメソッドを明示的にリストすることができます。それらを'束縛 'して個々のフィールドに割り当てることができます。同様に: 'var req = require( 'x.js'); User.prototype.name = {full:req.full.bind(this)、formal:req.formal.bind(this)}; '各オブジェクトにループを使用することもできます。 –

+3

これは私にとって悪いデザインのような感じです。 – Paul

答えて

4

この問題は、別のファイルにあることとは関係ありません。あなたはこのようなユーザを定義した場合は、一つのファイルにすべて同じ問題になるだろう:

var User = function(first, last){ 
    this.firstname = first; 
    this.lastname = last; 
}; 

User.prototype.name = { 
    full: function(){ 
     return this.firstname + " " + this.lastname; 
    }, 
    formal: function(){ 
     return "Mr. " + this.lastname; 
    } 
}; 

あなたがsomeuser.name.full()を呼び出すときthissomeuser.nameないsomeuserにバインドされますので。

あなたがObject.assignを使用することができ、これらの機能を名前空間に必要なだけ、あなたが別のファイルからプロトタイプを拡張する方法を他に不明な点があったためそのようにしたしていない場合は、次の

Object.assign(User.prototype, require('./methods/name.js')); 

次に、あなたができるようになりますsomeuser.full()またはsomeuser.formal()を呼び出し、もちろんthisには正しい値が設定されます。

+0

あああ!これはそれを行う方法です!グリーンチェック。 –

+0

名前空間問題の詳細です。私は、APIのすべてのエンドポイントにアクセスする方法を構築しています。名前空間はAPIの異なる部分であり、メソッドはエンドポイントへの呼び出しです。各呼び出しの認証情報は、私が 'this'をつかむことを試みているものです。 – tenor528

1

User.prototype.name = require('./methods/name').bind(this) 

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/bind

がバインド()メソッドが呼び出され、新しい関数を作成し、その このキーワードはに設定されています新しい関数が呼び出されたときに指定されたいずれかの先行する引数の の指定されたシーケンスを指定します。

—あなたの必須パスに.jsを失います。

+0

私の質問を理解する方法を除いて、私のコメントは、 'require'の結果は2つの関数を含むオブジェクトです。 –

+0

そして、彼がしなければならないことは、require()と '.bind'の間に別の' .funcName'を落とすことだけです。 'require( './ methods/name')。funcName.bind(this)' –

+0

はい、それは私の主張です。そのままでは、答えは不完全です。 –

0

これはモジュールが関数をエクスポートした場合あなたのコードは動作します

var userMethods = require('.methods/name.js'); 
var User = function(first, last){ 
    this.firstname = first; 
    this.lastname = last; 
}; 

User.prototype.name = userMethods.full; 
User.prototype.formalName = userMethods.formal; 

var Abbey = new User('Abbey', 'Jack'); 

console.log(Abbey.firstname); // Abbey 
console.log(Abbey.lastname); // Jack 
console.log(Abbey.name()); // Abbey Jack 
console.log(Abbey.formalName()); // Mr. Jack 

//メソッド/ name.js

module.exports = { 
    full: function(){ 
     return this.firstname + " " + this.lastname; 
    }, 
    formal: function(){ 
     return "Mr. " + this.lastname; 
    } 
};