2017-11-10 20 views
0
CurrentUser = function(){} 
CurrentUser.prototype = { 
    record: undefined 
} 
CurrentUser.prototype.is = { 
    get _parent() {return CurrentUser.prototype}, 

    get signedIn() { 
     return !!this._parent.record 
    } 
} 
User = new CurrentUser 
User.record = {name:'Joe'} 
User.is.signedIn //false 

ここで私がしようとしているのは、新しいユーザーを作成し、データ(レコード)を与え、それに基づいて彼がsignedInであると判断しますsignedIn)。es5クラスでのメソッド連鎖

実際には、Userインスタンスにアクセスする代わりに、User.is.signedInゲッターがCurrentUser.prototypeにアクセスしています。そしてCurrentUser.prototype.recordundefined - User.is.signedInとなり、falseが返されます。

+2

'User.record'は' CurrentUser.prototype.record'とは関係ありません。あなたはそれをすることはできません。 – SLaks

+0

SLaks、ここで私がしたいことを達成するために喜んでお勧めできますか? – avalanche1

+1

そのようなオブジェクトを簡単に連結する方法はありません。それをしないでください。 – SLaks

答えて

1

私たちはisゲッターが_parentにこれを割り当てる経由CurrentUser.prototypeへの参照を保持するオブジェクトを返すように(私は解決策を見つけた後Bergiの答えを見て)

CurrentUser.prototype = { 
    record: undefined, 
    get is() { return { 
     _parent: this, 
     get signedIn() {return !!this._parent.record} 
    }} 
} 

User = new CurrentUser 
User.record = {name:'Joe'} 
User.is.signedIn //true 

これをやってしまいました。そして、このオブジェクトには、_parentにアクセスするとCurrentUser.prototypeにアクセスする独自のゲッターがあります。 Voila!
Btw isゲッターの中に他の多くのメソッドgetterがある場合、それをスタンドアロンオブジェクトにリファクタリングしてObject.defineProperty()CurrentUser.prototypeに追加することができます。

PS
多くは連鎖クラスメソッドに対して助言誰もなぜを言うことができませんでした。
私は自分のコードができるだけ人間の言語に近くなるようにしています - そしてUser.is.signedInはちょうど私によく見えますUser.isSignedIn;また、is関連のチェックをisメソッドの中に入れていますので、User名前空間を混乱させることはありません。

+0

これを使わない理由?その場で非常に多くのオブジェクトを作成することは非効率的であるためです。自然言語は時々(例えばテストフレームワークで)有用かもしれませんが、実際にはあなたのコードは人間の言語ではなくあなたのデータ構造を反映する必要があります。 'User'名前空間に乱雑さはありません(もしあれば、クラスを分割し、メソッド名に句読点を入れないようにするだけです)、' .is'プロパティ自体はかなり意味がありません。なぜ 'User.is.signed.in'と' User.is.signed.out'も使わないのですか?私たちが一緒に引っ張る理由は十分です。 – Bergi

+0

https://www.google.ru/search?q=code+micro+optimization 最初の5つの記事は、コードの可読性とマイクロの最適化をアドバイスします – avalanche1

+0

あなたのソリューションは@ Bergi'sと同じですが、編集した方が良いでしょうコードの説明で答えてください。 – Taurus

0
class CurrentUser { 
    constructor(){ 
    this.record = null; 
    } 

    get isSignedIn(){ 
    return !!this.record; 
    } 

} 

const user = new CurrentUser; 
console.log(user.isSignedIn); 

user.record = {what:"ever"}; 
console.log(user.isSignedIn); 

単純にゲッターをプロトタイプ自体の中に入れて、サブオブジェクトに入れないでください。

+0

あなたはそれを試すことができます(http://jsbin.com/xofituquso/edit?console) –

+0

しかし、私はオブジェクトメソッドをチェーンしたかった.. – avalanche1

+0

@アバランシェ1あなたはしたくないです。 Theresのそれの利点は、単に不利益 –

0

いいえ、方法はありません。

策1(this結合ルールを微調整するcall方法を使用して):

function Foo() { 
 
    this.x = 10; \t 
 
    } 
 
    
 
    Foo.prototype.bar = { 
 
    baz: function() { 
 
    return this.x; \t 
 
    } \t 
 
    }; 
 
    
 
    var y = new Foo(); 
 
    
 
    console.log(y["bar"]["baz"].call(y));


策2(我々がインスタンス化時Foo.prototype.barにインスタンス化されたオブジェクトへの参照を追加) :

function Foo() { 
 
Foo.prototype.bar._this = this; 
 
this.x = 10; 
 
} 
 

 
Foo.prototype.bar = { 
 
baz: function() { 
 
return this._this.x; \t 
 
} \t 
 
}; 
 

 
var y = new Foo(); 
 

 
console.log(y["bar"]["baz"]());

this質問、またはthis oneを参照してください。

2

私は本当にこれを避けるために推薦するしかしあなたは

CurrentUser = function(){} 
CurrentUser.prototype = { 
    record: undefined, 
    get is() { 
     var parent = this; 
     return { 
      get signedIn() { 
       return !!parent.record; 
      } 
     }; 
    } 
}; 
var user = new CurrentUser 
user.record = {name:'Joe'} 
user.is.signedIn // true 

を探しているように見えます。簡単なisSignedIn()メソッドをプロトタイプに入れ、それを使って完了します。

関連する問題