同様に、我々は表示してテストコードを実行することができます。もちろんこれは私自身の理解整理によると、各クラスを見ています。キャンセルオリジナルのエクスポートデフォルトでは、便利なテストファイルがあります。以下のコードをコピーし、ファイル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を
あなたは二つの問題があることがわかります、以下は、テストのスクリーンショットです