【IT168技術】在講解MVC 的本質之前,我們首先給大家補習一下基礎知識,比如JavaScript 的類和事件。只有打下一個堅實的基礎,才能更好地學習、理解更高級的概念。
▲Javascript Web富應用開發圖書推薦
對於靜態的類來說,JavaScript 對象直接量就已經夠用了,但它對使用繼承和實例來創建經典的類往往更有幫助。有必要強調一下:JavaScript 是基於原型的程式語言,並沒有包含內置類的實現。但通過JavaScript 可以輕易地模擬出經典的類。
JavaScript 中的類口碑並不太好,因為「不夠JavaScript」而飽受批評。jQuery 並沒有涉及太多架構方法和繼承模式,這讓JavaScript 開發者確信自己不必考慮太多架構性的東西,甚至覺得類的用處不大或乾脆禁用類。實際上,類是另一種有用的工具,作為一名實用主義者,我相信類在JavaScript 中的重要性絲毫不亞於它在其他現代程式語言中的重要性。
JavaScript 中並沒有真正的類,但JavaScript 中有構造函數和new 運算符。構造函數用來給實例對象初始化屬性和值。任何JavaScript 函數都可以用做構造函數,構造函數必須使用new 運算符作為前綴來創建新的實例。
new 運算符改變了函數的執行上下文,同時改變了return 語句的行為。實際上,使用new和構造函數很類似於傳統的實現了類的語言:
var Person = function(name) {
this.name = name;
};
// 實例化一個Person
var alice = new Person('alice');
// 檢查這個實例
assert( alice instanceof Person );
構造函數的命名通常使用駝峰命名法,首字母大寫,以此和普通的函數區分開來,這是一種習慣用法。記住這一點非常重要,因為你不會希望用省略new 前綴的方式來調用構造函數。
// 不要這麼做!
Person('bob'); //=> undefined
這個函數只會返回undefined,並且執行上下文是window(全局)對象,你無意間創建了一個全局變量name。調用構造函數時不要丟掉new 關鍵字。
當使用new 關鍵字來調用構造函數時,執行上下文從全局對象(window)變成一個空的上下文,這個上下文代表了新生成的實例。因此,this 關鍵字指向當前創建的實例。儘管理解起來有些繞,實際上其他語言內置類機制的實現也是如此。
默認情況下,如果你的構造函數中沒有返回任何內容,就會返回this——當前的上下文。要不然就返回任意非原始類型的值。比如,我們可以返回一個用以新建一個新類的函數,第一步要做的是創建自己的類模擬庫:
var Class = function(){
var klass = function(){
this.init.apply(this, arguments);
};
klass.prototype.init = function(){};
return klass;
};
var Person = new Class;
Person.prototype.init = function(){
// 基於Person 的實例做初始化
};
// 用法:
var person = new Person;
令人費解的是,由於 JavaScript 2(http://www.mozilla.org/js/language/js20-1999-02-18/
classes.html)規範從未被實現過,class 一直都是保留字。最常見的做法是將變量名class 改為_class 或klass。