2017-05-22 14 views
0

アトリビュートとして配列を持つオブジェクトを作成した場合、そのオブジェクトにインスタンスを作成した後にハードコーディングされたコマンドの動作が異なるようにするメソッドを記述できますか?例えば特定のJavascriptコマンドを無効にすることはできますか?

私は、コンストラクタ定義されている場合、:

function Bunny(){ 
     this.arr = [1,2,3]; 
     this.doSomething = function(){ 
     // do something here 
     } 
} 

をして、新しいインスタンスを作成しました:

fluffy = new Bunny(); 

ときように、「this.doSomething」で何かを書くことも可能であろう

fluffy.arr[0]=7; 

次のような定義済みのコマンドを実行します。または配列の0番目のエントリを1から7に変更する代わりに)、「ハッピーイースター」というアラートがポップアップ表示されますか?

+0

【関連SO質問](https://stackoverflow.com/questions/1759987/listening-for-variable-changes-in-javascript-or-jquery) –

+2

関連する質問への答えは今、これを行う正しい方法である 'Proxy'についてほとんど言及していません。 – Alnitak

+0

@Alnitakはゲッターやセッターに希望はありませんか? –

答えて

2

ある程度まですることができます。入力:Proxies

プロキシはオブジェクトの周りのラッパーとして機能し、そのオブジェクトのプロパティの特定のイベントを代行受信できるようにします。 @LincolnBergeson

let arr = [1, 2, 3]; 
 

 
// Wrap the array in a proxy 
 
arr = new Proxy(arr, { 
 
    get(target, name) { 
 
    // Whenever the user accesses the ith element 
 
    // alert, 'Happy Easter! i' 
 
    alert(`Happy Easter! ${name}`); 
 
    
 
    // Return the actual value 
 
    return target[name]; 
 
    }, 
 
    
 
    // You can also target setters 
 
    set(target, name, value) { 
 
    // Whenever the user sets the ith element 
 
    // alert, 'Merry Christmas! i' 
 
    alert(`Merry Christmas! ${name}`); 
 
    
 
    target[name] = value; 
 
    } 
 
}); 
 

 
// Can still set values since a setter wasn't set 
 
arr[0] = 7; 
 
console.log(arr[0]);

+0

素晴らしい!ありがとう!ユーザーがi番目の要素にアクセスしたときにアクションを実行することもできます( 'Happy Easter!' + i)? – bloomers

+0

@bloomers絶対に!私はちょうどあなたがそれを行う方法を示すために私の答えを更新しました。 –

+1

素晴らしい!本当にありがとう! – bloomers

関連する問題