2016-07-26 4 views
1

例:アクション/メソッドをトリガするオブジェクトに値を割り当てることはできますか?

location = "http://www.mozilla.org"; 

あなたが新しいページに移動するa Location objectに文字列を代入します。

通常のJavascriptオブジェクトでも行うことができますか?

最初の方法はsetterですが、プロパティ名をObject.propertyとして指定する必要があります。

2番目の方法は割り当てオーバーロードですが、Javascriptではそのようなことはないようです。

答えて

0

いいえ、オブジェクトに何かを割り当て、JavaScriptでアクションメソッドを自動的に起動することはできません。 "location"は実際にはwindowオブジェクトのプロパティです。 locationプロパティのgetterは、 "href"とその他のプロパティとメソッドを持つオブジェクト "Location"を返します。 locationプロパティの設定子は文字列を受け取り、 "Location"オブジェクトの "href"プロパティに内部的に設定します。 JavaScript getterとsetterを使って、このようなものを自分で実装することができます。参照先:http://javascriptplayground.com/blog/2013/12/es5-getters-setters/を参照してください。 これは意味をなさないでしょう。

+0

それは得策ではないが常に可能です。 –

+0

@kingshuk bask:オブジェクト変数に何かを割り当てると、元のオブジェクト変数を上書きしますが、そのアクションメソッドをどのようにトリガーしますか? –

+0

オブジェクトのプロパティの現在の値と以前の値が同じか違うかを連続したスレッドでチェックするヘルパ関数が必要です。 @deepak bhatia –

1

よく、 Object.watch()のプロパティを使用できます。
しかし、すべてのブラウザでサポートされていないため、 Polyfillをファイルに追加する必要があります。
これらのレディメイド関数の他に、setTimeout()またはwindow.requestAnimationFrame()を使用して独自の関数を記述できます。この関数では、連続するスレッドの関数の特定のプロパティをチェックできます。

例:

var threadCheck = requestAnimationFrame || 
    webkitRequestAnimationFrame || 
    mozRequestAnimationFrame || 
    oRequestAnimationFrame || 
    msRequestAnimationFrame || 
    function(callback) { 
     setTimeout(callback, 16); 
    }, 

    oldProperty = {}, 

    watchFunction = function (obj, objProp) { 
    var len = objProp.length, 
     prop, 
     i; 
    for (i= 0; i < len; i++) { 
     prop = objProp[i]; 
     oldProperty[prop] = obj[prop]; 
    } 
    checkFunction(); 
}, 

checkFunction = function() { 
    var prop; 
    for (prop in oldProperty) { 
     if (oldProperty[prop] !== obj[prop]) { 
      executeFunction(); 
      oldProperty[prop] = obj[prop]; 
     } 
    } 
    threadCheck(checkFunction); 
}, 

executeFunction = function() { 
    console.log('changed') 
}, 

obj = { 
    propertyA : function() {}, 
    propertyB : 'check', 
    propertyC : { 
     dummy : 'xyz' 
    }, 
    propertyD : 999 
}; 

watchFunction(obj, ['propertyA', 'propertyB', 'propertyC', 'propertyD']); 

結果(Chromeブラウザのコンソールで指定されたコードを実行しているが、それは改善の多くのスコープがあり、ちょうどプロトタイプです。またunwatch()関数が実装される必要があります。):

obj.propertyA = function(){} 
(){} 
VM1016:35 changed 
obj.propertyB = 'check' 
"check" 
obj.propertyB = 'check1' 
"check1" 
VM1016:35 changed 
obj.propertyB = 'check1' 
"check1" 
obj.propertyB = 'check2' 
"check2" 
VM1016:35 changed 
obj.propertyA = 'check2' 
"check2" 
VM1016:35 changed 
obj.propertyA = function(){} 
(){} 
VM1016:35 changed 
obj.propertyD = 999 
999 
obj.propertyD = 99 
99 
VM1016:35 changed 
obj.propertyD = 991 
991 
VM1016:35 changed 
1

はいプロパティを定義します。

var test = function (msg) { 
    alert(msg); 
}; 

var d = Date.prototype; 
Object.defineProperty(d, "year", { 
    get: function() { return this.getFullYear() }, 
    set: function (y) { test(y); } 
}); 

d.year = 2016; 

Object.defineProperty(Window.prototype, "foo", { 
    get: function() { return 'hi' }, 
    set: function (y) { alert('hi' + y); } 
}); 

foo = 2016; 

Stackoverflow - Javascript getters and setters for dummies?

Mozilla - Working with objects

Mozilla - Object.defineProperty()

0

はい。 ES5は、セッターとゲッタのコンセプトを導入して、window.locationelement.innerHTMLのようなAPIと、javascriptでできることとの間のギャップを埋めるようにしました。

セッターとゲッターはオブジェクトリテラル内で直接定義することができます

var myobj = { 
    set foo (str) { 
    // execute a function 
    }, 
    get foo() { 
    // execute a function 
    } 
} 

お知らせ構文 - 何:は、正規のキー"set""get"と区別するために、キーワードsetget後にありません。実行上記宣言で

、次のいずれか

myobj.foo = somevalue; 

又はSOMEVAR = myobj.foo。

はそれぞれsetgetの機能を起動します。また

、あなたはすでにオブジェクトを持っている場合、あなたはObject. defineProperty()を使用してセッターとゲッターを持つプロパティを追加することが:

Object.defineProperty(myobj, "bar", { 
    get: function() { 
     // execute a function 
    }, 
    set: function (y) { 
     // execute a function 
    } 
}); 

myobj.bar = xを行うことbar用セッター関数を呼び出します。


詳細は以下を参照してください。

https://developer.mozilla.org/my/docs/Web/JavaScript/Reference/Functions/set

https://developer.mozilla.org/my/docs/Web/JavaScript/Reference/Functions/get

関連する問題