摘要:任何函數(shù)都可以用做構(gòu)造函數(shù),構(gòu)造函數(shù)必須使用運算符作為前綴來創(chuàng)建新的實例。當使用關(guān)鍵字來調(diào)用構(gòu)造函數(shù)時,執(zhí)行上下文從全局對象變成一個空的上下文,這個上下文代表了新生成的實例。默認情況下,如果構(gòu)造函數(shù)中沒有返回任何內(nèi)容,就會返回當前的上下文。
公開記錄學習JS MVC,不知道能堅持多久= =。以《基于MVC的JavaScript web富應用開發(fā)》為主要學習資料。
JavaScript的類JavaScript類的內(nèi)容好多,我腦容量太小,分兩次學習
JavaScript是基于原型的語言,沒有包含內(nèi)置的類,但是通過JavaScript可以輕易地模擬出經(jīng)典的類。JavaScript中有構(gòu)造函數(shù)和 new 運算符。構(gòu)造函數(shù)用來給實例對象初始化屬性和值。任何JavaScript函數(shù)都可以用做構(gòu)造函數(shù),構(gòu)造函數(shù)必須使用new 運算符作為前綴來創(chuàng)建新的實例。
new 運算符改變了函數(shù)的執(zhí)行上下文,同時改變了return 語句的行為。實際上,使用new和構(gòu)造函數(shù)和傳統(tǒng)的實現(xiàn)了類的語言中的使用方法是很類似的:
var Person = function(name) { this.name = name; }; // 實例化一個Person var alice = new Person("alice"); // 檢查這個實例 assert( alice instanceof Person );
構(gòu)造函數(shù)的命名通常使用駝峰命名法,首字母大寫,以此和普通的函數(shù)區(qū)分開來,這是一種習慣用法。
不要省略new前綴的方式來調(diào)用構(gòu)造函數(shù):
// 不要這么做! Person("bob"); //=> undefined
這個函數(shù)只會返回undefined,并且執(zhí)行上下文是window(全局)對象,你無意間創(chuàng)建了一個全局變量name。調(diào)用構(gòu)造函數(shù)時不要丟掉new關(guān)鍵字。
當使用new關(guān)鍵字來調(diào)用構(gòu)造函數(shù)時,執(zhí)行上下文從全局對象(window)變成一個空的上下文,這個上下文代表了新生成的實例。因此,this關(guān)鍵字指向當前創(chuàng)建的實例。盡管理解起來有些繞,實際上其他語言內(nèi)置類機制的實現(xiàn)也是如此。默認情況下,如果構(gòu)造函數(shù)中沒有返回任何內(nèi)容,就會返回this——當前的上下文。要不然就返回任意非原始類型的值。
創(chuàng)建自己的類模擬庫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;
給類添加函數(shù)由于 JavaScript 2 規(guī)范從未被實現(xiàn)過,class 一直都是保留字。最常見的做法是將變量名 class 改為 _class 或 klass。
在JavaScript 中,在構(gòu)造函數(shù)中給類添加函數(shù)和給對象添加屬性是一樣的:
Person.find = function(id){ /*...*/ }; var person = Person.find(1);
要想給構(gòu)造函數(shù)添加實例函數(shù),則需要用到構(gòu)造函數(shù)的prototype :
Person.prototype.breath = function(){ /*...*/ }; var person = new Person; person.breath();
一種常用的模式是給類的 prototype 起一個別名fn,寫起來也更簡單:
Person.fn = Person.prototype; Person.fn.run = function(){ /*...*/ };
這種模式在jQuery 的插件開發(fā)中是很常見的,將函數(shù)添加至jQuery.fn 中也就相當于添加至jQuery 的原型中。
給實現(xiàn)了類機制的類庫添加方法給類添加屬性和給構(gòu)造函數(shù)添加屬性是一樣的。
直接給類設置屬性和設置其靜態(tài)成員是等價的:
var Person = new Class; // 直接給類添加靜態(tài)方法 Person.find = function(id){ /* ... */ }; // 這樣我們可以直接調(diào)用它們 var person = Person.find(1);
給類的原型設置的屬性在類的實例中也是可用的:
var Person = new Class; // 在原型中定義函數(shù) Person.prototype.save = function(){ /* ... */ }; // 這樣就可以在實例中調(diào)用它們 var person = new Person; person.save();
這樣很難一眼就分辨出類的靜態(tài)屬性和實例的屬性。因此我們采用另外一種不同的方法來給類添加屬性,這里用到了兩個函數(shù)extend() 和include() :
var Class = function () { var klass = function () { this.init.apply(this, arguments); }; klass.prototype.init = function () {}; // 定義 prototype 的別名 klass.fn = klass.prototype; // 定義類的別名 klass.fn.parent = klass; // 給類添加屬性 klass.extend = function (obj) { var extended = obj.extended; for (var i in obj) { klass[i] = obj[i]; } if (extended) extended(klass) }; // 給實例添加屬性 klass.include = function (obj) { var included = obj.included; for (var i in obj) { klass.fn[i] = obj[i]; } if (included) included(klass) }; return klass; };
這段代碼使用extend() 函數(shù)來生成一個類,這個函數(shù)的參數(shù)是一個對象。通過迭代將對象的屬性直接復制到類上:
var Person = new Class; Person.extend({ find: function(id) { /* ... */ }, exists: functions(id) { /* ... */ } }); var person = Person.find(1);
include() 函數(shù)的工作原理也一樣,只不過不是將屬性復制至類中,而是復制至類的原型中。換句話說,這里的屬性是類實例的屬性,而不是類的靜態(tài)屬性。
var Person = new Class; Person.include({ save: function(id) { /* ... */ }, destroy: functions(id) { /* ... */ } }); var person = new Person; person.save();
同樣地,這里的實現(xiàn)支持extended 和included 回調(diào)。將屬性傳入對象后就會觸發(fā)這兩
個回調(diào):
Person.extend({ extended: function(klass) { console.log(klass, " was extended!"); } });
這種寫法已經(jīng)可以支持模塊了。模塊是可重用的代碼段,用這種方法可以實現(xiàn)各種繼承,用來在類之間
共享通用的屬性。
var ORMModule = { save: function(){ // 共享的函數(shù) } }; var Person = new Class; var Asset = new Class; Person.include(ORMModule); Asset.include(ORMModule);
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/85500.html
摘要:實際上,可以將其理解為某種形式的繼承。如果上下文是,則使用全局對象代替。例如的第個參數(shù)是上下文,后續(xù)是實際傳入的參數(shù)序列中允許更換上下文是為了共享狀態(tài),尤其是在事件回調(diào)中。 公開記錄學習JS MVC,不知道能堅持多久= =。以《基于MVC的JavaScript web富應用開發(fā)》為主要學習資料。接上一篇類的學習,發(fā)現(xiàn)實在是看暈了,有些例子是能看懂在干嘛,但是不知道為什么這樣做,有的甚至...
摘要:基于函數(shù)進行調(diào)用的,用來確保函數(shù)是在指定的值所在的上下文中調(diào)用的。添加私有函數(shù)目前上面為類庫添加的屬性都是公開的,可以被隨時修改。以基于的富應用開發(fā)為主要學習資料。 控制類庫的作用域 在類和實例中都添加proxy函數(shù),可以在事件處理程序之外處理函數(shù)的時候保持類的作用域。下面是不用proxy的辦法: var Class = function(parent){ var klas...
摘要:官方說法注本人英語二十六級是和用來創(chuàng)建用戶界面的庫。很多人將認為是中的。怎么說呢現(xiàn)在的自己就是個跟風狗啊,什么流行先學習了再說,再看看能不能應用在具體項目上。暫時先停下的學習,坐等。不過學習的腳步還是跟不上潮流的發(fā)展速度啊。 Why React? 官方說法 注:本人英語二十六級 React是Facebook和Instagram用來創(chuàng)建用戶界面的JavaScript庫。很多...
摘要:以基于的富應用開發(fā)為主要學習資料。下面用實現(xiàn)一個例子使用匿名函數(shù)來封裝一個作用域在頁面加載時綁定事件監(jiān)聽上面的代碼創(chuàng)建了控制器,這個控制器是放在變量下的命名空間。然后用了一個匿名函數(shù)封裝了一個作用域,以避免對全局作用域造成污染。 公開記錄學習JS MVC,不知道能堅持多久= =。以《基于MVC的JavaScript web富應用開發(fā)》為主要學習資料。 什么是MVC MVC 是一種設...
摘要:模型應當從視圖和控制器中解耦出來。與數(shù)據(jù)操作和行為相關(guān)的邏輯都應當放入模型中,通過命名空間進行管理。在應用中,對象關(guān)系映射也是一種非常有用的技術(shù),它可以用來做數(shù)據(jù)管理及用做模型。以基于的富應用開發(fā)為主要學習資料。 MVC 和命名空間 要確保應用中的視圖、狀態(tài)和數(shù)據(jù)彼此清晰分離,才能讓架構(gòu)更加整潔有序且更加健壯。模型應當從視圖和控制器中解耦出來。與數(shù)據(jù)操作和行為相關(guān)的邏輯都應當放入模型...
閱讀 2993·2021-10-13 09:39
閱讀 2694·2021-09-27 13:34
閱讀 2031·2019-08-30 15:55
閱讀 3260·2019-08-30 15:43
閱讀 3631·2019-08-30 11:16
閱讀 1748·2019-08-26 18:28
閱讀 1284·2019-08-26 13:56
閱讀 915·2019-08-26 13:35