VUE MVVM原理と単純な実装 - パートI

Object.definePropertyはじめに- 
    LET OBJ = {}; 
    Object.defineProperty(OBJ、 '学校'は、{ 
        コンは:trueに// 属性を削除することができます
        // trueに、//プロパティを変更することができます:書き込み可能 
        :列挙をtrueに// プロパティを列挙することができる
        @ 値: 'zfpx'、//プロパティ値の設定

        セット:関数(値){ 
            にconsole.log(値); // 時間obj.school割り当て、コールセット()メソッドを
        } 
        GET:関数(){
             リターン 'zfpx'; // 値がobj.school、get()メソッドを呼び出して取得します
        } 
    })
<!DOCTYPE HTML> 
<HTML LANG = "EN"> 
<HEAD> 
    <METAのcharset = "UTF-8"> 
    <タイトル>ドキュメント</ TITLE> 
</ HEAD> 
<SCRIPT SRC =「HTTPS://cdn.jsdelivr .NET / NPM / VUE / DIST / vue.js "> </ SCRIPT> 
<body> 
<DIV ID ="アプリケーション「> 
    <P> {} {} AA </ P> 
    <DIV> {B} {}
 < DIV> {{B}} </ div> 
    </ div> 
</ div> 
</ body> 
<! - MVVM双方向データバインディング
VUEデータハイジャック + モデルをサブスクライブ・パブリッシュは、
以前のバージョンObject.definePropertyと互換性がありません > - 
<スクリプト> 
機能(ウィンドウ、
        文書){ 関数 ZF(オプション= {}){
             この。=は$オプションオプションを; // すべての属性はオプションで$ MOUNT 
            データ=ましょうこの ._data = この$のoptions.data ;.
             この; .observe(データ)
             のために(せキーデータ){ // 属性によって定義されたObject.defineProperty属性データ
                // データエージェント
                // このエージェントthis._data 
                Object.defineProperty(、キー、{ 
                    可算:trueに// 列挙 
                    GET:機能(){
                         返す この._dataを[キー]。
                    }、
                    SET:関数(newValに){ // の時間値を変更
                        この ._data [キー] = newValにする; 
                    } 
                }); 
            } 
            この .Compile(options.el、この); 
        } 
        // コンパイラ 
        ZF.prototype.Compile = 関数(EL、VM){ 
            VM $ EL。 = document.querySelector(EL)は、
            断片せ = document.createDocumentFragment();
             ながら(子= $ el.firstChild VM){   // メモリにコンテンツアプリ意志
                fragment.appendChild(子)。
            } 
            // 循环每一层 
            Array.from(fragment.childNodes).forEach(関数(ノード){ 

                テキストせ = node.textContent; 
                REGせ = /\{\{(.*)\}\}/ ; 
    
                場合( (テキスト)){reg.test 
                    ARRましょう。$ 1.split =正規表現( '' ); 
                    ヴァルせ = VM; 
                    にconsole.log(node.childNodes)
                    にconsole.log(ARR)
                    arr.forEach(関数(K){ 
                        ヴァル =ヴァル[K]; 
                    })
                    // あるいは 
                    node.textContent = text.replace(/\{\{(.*)\}\}/ 、ヴァル)
                } 
                // node.textContent.textContent(12)である

            })
            VM。 el.appendChild $(断片); 
        } 
        // ;オブジェクトに観察対象がObjectDefineProperty増加 
        ZF.prototype.observe = 関数(データ){
             // はconsole.log(データ)
            を返す 新しい新しい観察(データ); 
            
        } 
        関数観察する(データ) {
             のため(LETキーデータ){ //属性データは、プロパティObject.definePropertyの方法によって定義される 
                せヴァル= データ[キー];
                 // 再帰
                IFtypeof演算「オブジェクト」===ヴァル{)
                    観察(ヴァル); 
                } 
                Object.defineProperty(データ、キー、{ 
                    列挙:trueに// 列挙 
                    :GET 関数(){
                         リターン;ヴァル
                    、} 
                    // ハイジャックデータ 
                    :SETの関数(newValに){ // 変更時間値
                        であれば(newValに=== ヴァル){
                             返します
                        } 
                        場合typeof演算 newValに=== 'オブジェクト' ){ 
                            (newValに)を確認し、
                        } 
                        ヴァル = newValに。//
                     } 
                })。
            } 
        } 
        window.ZF = ZF。

    })(ウィンドウ、ドキュメント)。

    せZFは = 新しいZFを({ 
        EL: "#app" 
        データ:{:{: '是'}、B: '是B' }、
    })


    
</スクリプト> 
</ HTML>

 

おすすめ

転載: www.cnblogs.com/cl94/p/12235968.html