亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

JavaScript MVC 學(xué)習(xí)筆記(六)模型之ORM

mrcode / 1027人閱讀

摘要:模型應(yīng)當(dāng)從視圖和控制器中解耦出來。與數(shù)據(jù)操作和行為相關(guān)的邏輯都應(yīng)當(dāng)放入模型中,通過命名空間進(jìn)行管理。在應(yīng)用中,對象關(guān)系映射也是一種非常有用的技術(shù),它可以用來做數(shù)據(jù)管理及用做模型。以基于的富應(yīng)用開發(fā)為主要學(xué)習(xí)資料。

MVC 和命名空間

要確保應(yīng)用中的視圖、狀態(tài)和數(shù)據(jù)彼此清晰分離,才能讓架構(gòu)更加整潔有序且更加健壯。模型應(yīng)當(dāng)從視圖和控制器中解耦出來。與數(shù)據(jù)操作和行為相關(guān)的邏輯都應(yīng)當(dāng)放入模型中,通過命名空間
進(jìn)行管理。

在JavaScript 中,通過給對象添加屬性來管理一個(gè)命名空間,這個(gè)命名空間可以是函數(shù),也可以是變量,比如:

var User = {
    records: [ /* ... */ ]
};

User 的數(shù)組數(shù)據(jù)就在命名空間User.records 中。和user 相關(guān)的函數(shù)也可以放入U(xiǎn)ser 模型的命名空間里。比如用fetchRemote() 函數(shù)來從服務(wù)器端獲取user 的數(shù)據(jù):

var User = {
    records: [],
    fetchRemote: function(){ /* ... */ }
};

將模型的屬性保存至命名空間中的做法可以確保不會(huì)產(chǎn)生沖突,這也是符合MVC 原則的,同時(shí)也能避免代碼變成一堆函數(shù)和回調(diào)混雜在一起的大雜燴。

可以對命名空間做一點(diǎn)改進(jìn),將那些在真實(shí)user 對象上的和user 實(shí)例相關(guān)的函數(shù)也都添加進(jìn)去。假設(shè)user 記錄包含一個(gè)destory() 函數(shù),它是和具體的user 相關(guān)的,因此這個(gè)函數(shù)應(yīng)當(dāng)基于User 實(shí)例進(jìn)行調(diào)用:

var user = new User;
user.destroy()

為了做到這一點(diǎn),應(yīng)當(dāng)將User 寫成一個(gè)類,而不是一個(gè)簡單對象:

var User = function(atts){
    his.attributes = atts || {};
};

User.prototype.destroy = function(){
    /* ... */
};

對于那些和具體的user 不相關(guān)的函數(shù)和變量,則可以直接定義在User 對象中:

User.fetchRemote = function(){
    /* ... */
};
構(gòu)建對象關(guān)系映射(ORM)

對象關(guān)系映射(Ojbect-relational mapper,簡稱ORM)是在除JavaScript 以外的編程語言中常見的一種數(shù)據(jù)結(jié)構(gòu)。在JavaScript 應(yīng)用中,對象關(guān)系映射也是一種非常有用的技術(shù),它可以用來做數(shù)據(jù)管理及用做模型。比如使用ORM 可以將模型和遠(yuǎn)程服務(wù)捆綁在一起,任何模型實(shí)例的改變都會(huì)在后臺(tái)發(fā)起一個(gè)Ajax 請求到服務(wù)器端。或者將模型實(shí)例和HTML 元素綁定在一起,任何對實(shí)例的更改都會(huì)在界面中反映出來。

現(xiàn)在讓來創(chuàng)建一個(gè)自定義ORM。

本質(zhì)上講,ORM 是一個(gè)包裝了一些數(shù)據(jù)的對象層。以往ORM 常用于抽象SQL 數(shù)據(jù)庫,但在這里ORM 只是用于抽象JavaScript 數(shù)據(jù)類型。這個(gè)額外的層有一個(gè)好處,可以通過給它添加自定義的函數(shù)和屬性來增強(qiáng)基礎(chǔ)數(shù)據(jù)的功能。比如添加數(shù)據(jù)的合法性驗(yàn)證、監(jiān)聽、數(shù)據(jù)持久化及服務(wù)器端的回調(diào)處理等,這樣會(huì)增加代碼的重用率。

原型繼承

這里使用Object.create() 來構(gòu)造ORM,這里使用基于原型(prototype-based)的繼承,而沒有用到構(gòu)造函數(shù)和new關(guān)鍵字。

Object.create() 只有一個(gè)參數(shù)即原型對象,它返回一個(gè)新對象,這個(gè)新對象的原型就是傳入的參數(shù)。換句話說,傳入一個(gè)對象,返回一個(gè)繼承了這個(gè)對象的新對象。

對于不支持的Object.create()的瀏覽器 ,可以很容易地模擬出這個(gè)函數(shù):

if (typeof Object.create !== "function")
    Object.create = function(o) {
        function F() {}
        F.prototype = o;
        return new F();
    };

現(xiàn)在來創(chuàng)建Model 對象,Model 對象將用于創(chuàng)建新模型和實(shí)例:

var Model = {
    inherited: function(){},
    created: function(){},
    prototype: {
        init: function(){}
    },

    create: function(){
        var object = Object.create(this);
        object.parent = this;
        object.prototype = object.fn = Object.create(this.prototype);
        object.created();
        this.inherited(object);
        return object;
    },

    init: function(){
        var instance = Object.create(this.prototype);
        instance.parent = this;
        instance.init.apply(instance, arguments);
        return instance;
    }
};

create() 函數(shù)返回一個(gè)新對象,這個(gè)對象繼承自Model 對象,使用它來創(chuàng)建新模型。
init() 函數(shù)返回一個(gè)新對象,它繼承自Model.prototype——如Model 對象的一個(gè)實(shí)例:

var Asset = Model.create();
var User = Model.create();
var user = User.init();
添加ORM 屬性

現(xiàn)在如果給Model 對象添加屬性,對于繼承的模型來說,這些新增屬性都是可訪問的:

// 添加對象屬性
jQuery.extend(Model, {
    find: function(){}
});

// 添加實(shí)例屬性
jQuery.extend(Model.prototype, {
    init: function(atts) {
        if (atts) this.load(atts);
    },
    load: function(attributes){
        for(var name in attributes)
        this[name] = attributes[name];
    }
});

jQuery.extend() 只是代替for 循環(huán)手動(dòng)復(fù)制屬性的一種快捷方式,這和在load()
函數(shù)中的做法差不多。現(xiàn)在,對象和實(shí)例屬性都傳播到了多帶帶的模型里:

assertEqual( typeof Asset.find, "function" );

實(shí)際上我們會(huì)增加很多屬性,因此還需將extend() 和include() 添加至Model 對象中:

var Model = {
    /* ……代碼片段……*/
    extend: function(o){
        var extended = o.extended;
        jQuery.extend(this, o);
        if (extended) extended(this);
    },

    include: function(o){
        var included = o.included;
        jQuery.extend(this.prototype, o);
        if (included) included(this);
    }
};

// 添加對象屬性
Model.extend({
    find: function(){}
});

// 添加實(shí)例屬性
Model.include({
    init: function(atts) { /* ... */ },
    load: function(attributes){ /* ... */ }
});

現(xiàn)在可以創(chuàng)建新的資源并設(shè)置一些屬性:

var asset = Asset.init({name: "foo.png"});

【公開記錄學(xué)習(xí)JS MVC,不知道能堅(jiān)持多久= =。以《基于MVC的JavaScript web富應(yīng)用開發(fā)》為主要學(xué)習(xí)資料?!?/p>

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/91480.html

相關(guān)文章

  • JavaScript MVC 學(xué)習(xí)筆記(七)模型ORM

    摘要:從技術(shù)的角度講,出于的原因,無法友好正式地生成位的,它只能生成偽隨機(jī)數(shù)。雖然中內(nèi)置的方法盡管產(chǎn)生的是偽隨機(jī)數(shù),但也足夠用了。 持久化記錄 需要一種保持記錄持久化的方法,即將引用保存至新創(chuàng)建的實(shí)例中以便任何時(shí)候都 能訪問它。通過在Model 中使用records 對象來實(shí)現(xiàn)。當(dāng)保存一個(gè)實(shí)例的時(shí)候, 就將它添加進(jìn)這個(gè)對象中;當(dāng)刪除實(shí)例時(shí),和將它從對象中刪除: // 用來保存資源的對象 ...

    animabear 評論0 收藏0
  • JavaScript MVC 學(xué)習(xí)筆記(一)初識JS MVC

    摘要:以基于的富應(yīng)用開發(fā)為主要學(xué)習(xí)資料。下面用實(shí)現(xiàn)一個(gè)例子使用匿名函數(shù)來封裝一個(gè)作用域在頁面加載時(shí)綁定事件監(jiān)聽上面的代碼創(chuàng)建了控制器,這個(gè)控制器是放在變量下的命名空間。然后用了一個(gè)匿名函數(shù)封裝了一個(gè)作用域,以避免對全局作用域造成污染。 公開記錄學(xué)習(xí)JS MVC,不知道能堅(jiān)持多久= =。以《基于MVC的JavaScript web富應(yīng)用開發(fā)》為主要學(xué)習(xí)資料。 什么是MVC MVC 是一種設(shè)...

    xorpay 評論0 收藏0
  • Deep in JS - 收藏集 - 掘金

    摘要:今天同學(xué)去面試,做了兩道面試題全部做錯(cuò)了,發(fā)過來給道典型的面試題前端掘金在界中,開發(fā)人員的需求量一直居高不下。 排序算法 -- JavaScript 標(biāo)準(zhǔn)參考教程(alpha) - 前端 - 掘金來自《JavaScript 標(biāo)準(zhǔn)參考教程(alpha)》,by 阮一峰 目錄 冒泡排序 簡介 算法實(shí)現(xiàn) 選擇排序 簡介 算法實(shí)現(xiàn) ... 圖例詳解那道 setTimeout 與循環(huán)閉包的經(jīng)典面...

    enali 評論0 收藏0
  • 我的Android重構(gòu)旅:架構(gòu)篇

    摘要:是的架構(gòu)的實(shí)現(xiàn)。是在年提出的一種前端架構(gòu),主要用來處理復(fù)雜的邏輯的一致性問題當(dāng)時(shí)是為了解決頁面的消息通知問題。 去年10月底來到了新公司,剛開始接手 Android 項(xiàng)目時(shí),發(fā)現(xiàn)該項(xiàng)目真的是一團(tuán)遭,項(xiàng)目開發(fā)上沒有任何架構(gòu)可言,開發(fā)人員連簡單的 MVC、MVP 都不了解,Activity 及其臃腫,業(yè)務(wù)邊界也不明確,因此我決定重新分析一下當(dāng)前主流的幾種開發(fā)架構(gòu),選出適合當(dāng)前項(xiàng)目的架構(gòu)形式...

    mylxsw 評論0 收藏0
  • Backbone.js學(xué)習(xí)筆記(一)

    摘要:它通過數(shù)據(jù)模型進(jìn)行鍵值綁定及事件處理,通過模型集合器提供一套豐富的用于枚舉功能,通過視圖來進(jìn)行事件處理及與現(xiàn)有的通過接口進(jìn)行交互。 本人兼職前端付費(fèi)技術(shù)顧問,如需幫助請加本人微信hawx1993或QQ345823102,非誠勿擾 1.為初學(xué)前端而不知道怎么做項(xiàng)目的你指導(dǎo) 2.指導(dǎo)并扎實(shí)你的JavaScript基礎(chǔ) 3.幫你準(zhǔn)備面試并提供相關(guān)指導(dǎo)性意見 4.為你的前端之路提供極具建設(shè)性的...

    FrancisSoung 評論0 收藏0

發(fā)表評論

0條評論

最新活動(dòng)
閱讀需要支付1元查看
<