VUE学習II:オブジェクト検出ウォッチャーの変更

同様に、我々は表示してテストコードを実行することができます。もちろんこれは私自身の理解整理によると、各クラスを見ています。キャンセルオリジナルのエクスポートデフォルトでは、便利なテストファイルがあります。以下のコードをコピーし、ファイルvuetest02.jsを追加

クラス発{ 
    コンストラクタ(){ 
        this.subs = []; 
    } 
    ADDSUB(サブ){ 
        this.subs.push(サブ)。
    } 
    // removeSub(サブ){ 
    //削除(this.subs、サブ)。
    //} 
    依存(){ 
        IF(window.target){ 
            this.addSub(window.target)
        } 
    } 
    通知(){ 
        CONST SUBS = this.subs.slice()。
        以下のための(I = 0せ; I <subs.lengthを、I ++){ 
            SUBS [I] .update()。
        } 
    } 
} 
CONST bailRE = /[^\w.$]/ 

機能parsePath(パス){  
    IF(bailRE.test(パス)){
        リターン。
    }
    セグメントpath.split =一定( ''); 
    return関数(OBJ){ 
        (OBJ!)リターンIF; 
        //console.log(obj); 
        I <segments.length; I ++){(I = 0ましょうため
            //console.log(segments[i]); 
            OBJ = OBJ [セグメント[I]]; 
        } 
        OBJ返す; 
    } 
} 

VARウィンドウ= {}; //グローバルプロパティページアナログ

クラスウォッチャー{ 
    コンストラクタ(VM、expOrFn、CB ){ 
        this.vm = VM; 
        // this.getter()、得ることができるdata.abcコンテンツを実行
        this.getter = parsePath(expOrFn); 
        this.cb = CB;         
    } 
    GET(){ 
        this.value = this.get ();
        console.log( "this.value ..." + this.value); 
        window.target =これを、
        値= this.getter.call(this.vm、this.vm)とします。
        window.target =未定義。
        値を返します。
    } 
    更新(){ 
        CONST OLDVALUE = this.value。
        this.value = this.get()。
        this.cb.call(this.vm、this.value、OLDVALUE)。
    } 
} 

クラスオブザーバー{ 
    コンストラクタ(値){ 
        this.value =値。
        (!Array.isArray(値)){もし
            this.walk(値); 
        } 
    } 
    ウォーク(OBJ){ 
        CONSTキー= obj.keys(OBJ)。 
        ため(LET I 0 =; I <keys.length; I ++){ 
            defineReactive(OBJ、キー[I]、obj.keys [i])と 
        } 
    } 
} 

関数defineReactive(データ、キー、ヴァル){ 
    //新增、递归子属性
    場合(typeof演算ヴァル== 'オブジェクト'){ 
        新たなオブザーバー(ヴァル)。
    } 
    )DEP =新しい発(ましょう。
    Object.defineProperty(データ、キー、{ 
        列挙:真、
        設定:○、
        取得:関数を(){ 
            dep.depend(); 
            戻りヴァル; 
        }、
        セット:関数(newValに){ 
            IF(ヴァル=== newValに){ 
                リターン; 
            } 
            ヴァル= newValに。 
            dep.notify();             
        } 
    })
} 

テストの準備と同じデータを持つ// 01。
塩基} = {VAR; 
defineReactive(ベース、 "名前"、 "ケビン"); 

// DOMを変更する方法を準備します。プロパティが助けに変わって、私はこの方法の限りを呼び出していることを
機能updateVm(VM、newValに、OLDVALUE){ 
    はconsole.log( `新しい値が変化することによってコントロールの外観... newValに= $ {} newValに、 OLDVALUE = $ { } `OLDVALUE); 
} 

せて新たな新たなウォッチャー時計=(ベース、 "名前"、updateVm); 
base.name =」洒落"; 
base.name =" witty2 "; 
base.name =" witty3 "; 
はconsole.log("テストが完了しています。「)

  コマンドウィンドウで、次のコマンドを実行しますノードvuetest02.jsを

あなたは二つの問題があることがわかります、以下は、テストのスクリーンショットです

 

おすすめ

転載: www.cnblogs.com/kevin-Y/p/12483398.html