javascriptは双方向データバインディングを簡単に実現します.
4121 ワード
直接コード
その中のobject.defineProperty、vue.jsはそれを通じて双方向の結合を実現したのです.
descriptor彼は以下のように評価しています.私たちは簡単に認識して、後の例を紹介します. value:属性の値(言うまでもない) writable:falseの場合、属性の値は書き換えられません.読み取り専用の です. configrable:総スイッチは、一旦falseであると、もう彼をセットすることができません. enumerable:for...inサイクル中に巡回できますか?それともObject.keysに列挙されます. get:後で詳しく話してください. set:後で詳しく話してください.
第一例を見てみましょう.
configrable
総スイッチは初めてfalseを設置した後、二回目は何の設定もできません.例えば、
writable
fasleに設定すると、読み取り専用になります.
属性特性enumerableは、オブジェクトの属性をfor...inサイクルとObject.keys()に列挙できるかどうかを定義します.
セットとゲット
descriptorの中に訪問器(getとset)とwriableまたはvalueを同時に設置してはいけません.そうでないと間違います.つまり、使ってみたいということです.setとgetは使えません.
Title
function watch(obj,key,callback) {
var old = obj[key];
// :
// : 。
// : 。(descriptor)
Object.defineProperty(obj,key,{
set:function(val){
var oldVal = old;
old = val;
callback(val,oldVal,this);
},
get:function(){
return old;
}
});
}
var input = document.getElementById("myinput");
var bind = document.getElementById("bind");
var obj = {};
watch(obj, "input",function (val) {
input.value = val;
bind.value = val;
console.log(" view , module , "+val);
});
bind.onkeyup = function() {
obj.input = bind.value;
}
input.onkeyup = function () {
obj.input = input.value;
};
注:コンソールでobj.inputの値を変えて入力ボックスの値を変えることができます.その中のobject.defineProperty、vue.jsはそれを通じて双方向の結合を実現したのです.
var a= {}
Object.defineProperty(a,"b",{
value:123
})
console.log(a.b);//123
とても簡単です.三つのパラメータを受け入れます.全部必要です.パラメータの最初のパラメータ:オブジェクトの2番目のパラメータ:定義された属性または方法の名前が必要です.三つ目のパラメータ:ターゲット属性が持つ特性.(descriptor)前の二つのパラメータは多くなくて、コードを見れば分かります.主に第三のパラメータdescriptorを見て、どのような評価がありますか?descriptor彼は以下のように評価しています.私たちは簡単に認識して、後の例を紹介します.
第一例を見てみましょう.
var a= {}
Object.defineProperty(a,"b",{
value:123
})
console.log(a.b);//123
私たちはvalueを設置しただけで、他の設定はしていませんが、初めての時は簡単に理解できます.これはデフォルトで私たちにwritable、configrable、enumerableを教えてくれます.値を設定します.値はすべてfalseです.つまり、上のコードと下のコードは等価です(初回設定の場合に限ります).var a= {}
Object.defineProperty(a,"b",{
value:123,
writable:false,
enumerable:false,
configurable:false
})
console.log(a.b);//123
以上はとても重要ですよ.以上の理解はsetとgetには効きません.configrable
総スイッチは初めてfalseを設置した後、二回目は何の設定もできません.例えば、
var a= {}
Object.defineProperty(a,"b",{
configurable:false
})
Object.defineProperty(a,"b",{
configurable:true
})
//error: Uncaught TypeError: Cannot redefine property: b
間違えます.上記のデフォルト値に注意してください.初めてセットしないとどうなりますか?falseに設定してあげます.だから.二回目です.彼を再設置したらどうなりますか?そうです.間違いを報告します.writable
fasleに設定すると、読み取り専用になります.
var a = {};
Object.defineProperty(a, "b", {
value : 37,
writable : false });
console.log(a.b); // 37
a.b = 25; // ( , )
console.log(a.b); // 37, 。
enumerable属性特性enumerableは、オブジェクトの属性をfor...inサイクルとObject.keys()に列挙できるかどうかを定義します.
var a= {}
Object.defineProperty(a,"b",{
value:3445,
enumerable:true
})
console.log(Object.keys(a));// ["b"]
falseに変更var a= {}
Object.defineProperty(a,"b",{
value:3445,
enumerable:false //
})
console.log(Object.keys(a));// []
for…inは類似していますので、詳しくは説明しません.セットとゲット
descriptorの中に訪問器(getとset)とwriableまたはvalueを同時に設置してはいけません.そうでないと間違います.つまり、使ってみたいということです.setとgetは使えません.
var a= {}
Object.defineProperty(a,"b",{
set:function(newValue){
console.log(" , "+newValue)
},
get:function(){
console.log(" ")
return 2 // , 2
}
})
a.b =1 // , 1
console.log(a.b) //
// 2 ,
簡単に言えば、この「b」の値付けや値取りはそれぞれsetとgetの対応する関数をトリガします.これがobserveを実現する鍵です.次のページでは、vueのobserveの実現ソースコードを分析して、自分がどのように一歩一歩実現するかを話します.var a = {
b: {
c:1
},
d:1
}
a.$watch("b.c",()=>console.log(" "))
要約:http://www.cnblogs.com/weiqu/p/5860945.html