摘要:在這里講到的很多也許只和程序?qū)τ诠ぷ鳈C(jī)制的操作有關(guān),但是作為初探也許也就足夠了。一般情況下還有空字符串都會被判斷成。面向特征編程面向特征編程的全稱是。
引子
元編程會有如下的定義:
在這里講到的很多也許只和程序?qū)τ诠ぷ鳈C(jī)制的操作有關(guān),但是作為初探也許也就足夠了。 鑒于我也是邊學(xué)邊寫的這篇文章,如果有謬誤之處,還請指出。
創(chuàng)建帶有默認(rèn)參數(shù)的函數(shù)function repeat(func, times) { times = (Object.prototype.toString.call(times) === "[object Undefined]")?1:times; for(var i = 0; i < times; i++){ func(); } }
在函數(shù)中使用 Object.prototype.toString.call(times) 是為了解決 javascript 判斷值為空的問題,使用這種寫法才會比較的安全。一般情況下 false, 0, undefined, null 還有 空字符串 都會被判斷成 false。
創(chuàng)建自優(yōu)化的行數(shù)在瀏覽器的實(shí)現(xiàn)上會有許多的不同,有時候就需要使用分支。一般情況下都是監(jiān)測需要調(diào)用的對象或者屬性是否存在,進(jìn)而進(jìn)行下一步的操作,像下面的一樣:
function addEvent(elem, type, func){ if (document.addEventListener) { elem.addEventListener(type, func); } else { elem.attachEvent(type, func); } }
雖然這段代碼可能還有很多其它的問題,但是這段代碼每次在執(zhí)行時都會進(jìn)行一次判斷,然而理論上應(yīng)該可以做到只在第一次運(yùn)行的時候進(jìn)行判斷: 當(dāng)?shù)谝淮握{(diào)用的時候,針對特定的瀏覽器去將自己重寫成另外的一個版本 :
function newAddEvent (elem, type, func) { if (document.addEventListener){ newAddEvent = function(element, type, func){ element.addEventListener(type, func); } } else { newAddEvent = function(element, type, func){ element.attachEvent(type, func); } } newAddEvent(elem, type, func); }
在這個函數(shù)中,第一次調(diào)用的時候會進(jìn)行判斷支持的方法類型,然后就會替換掉原來函數(shù)的內(nèi)容,最后都會執(zhí)行新的函數(shù)。雖然這個是一個簡單的例子,但是可以把它引申并且使用到其它復(fù)雜的環(huán)境中去,這樣就可以提高運(yùn)行的效率了。
面向特征編程(AOP)面向特征編程的全稱是: Aspect-oriented Programming。面向特征編程本質(zhì)上就是使用函數(shù)執(zhí)行前后的代碼去擴(kuò)展當(dāng)前的函數(shù),而不是使用繼承的方式去擴(kuò)展。
在調(diào)試一段代碼的時候,需要在這個代碼被調(diào)用的時候?qū)懸恍┤罩荆?傳入的參數(shù)以及函數(shù)調(diào)用之后的返回值,并且這樣不會影響到函數(shù)的正常執(zhí)行 ,我們可以這樣寫:
Bar = { foo: function(){ ... } }; Bar.foo = Bar.foo.debug(function(original, args){ var _r; console.log(args); _r = original(args); console.log(_r); return _r; });
(注: 此處的參數(shù)部分簡略寫了,不要在意這些細(xì)節(jié)~) 我在這里擴(kuò)展了Function的prototype的方法,將原始函數(shù)作為第一個參數(shù)傳入,其實(shí)還可以稍加改變,在新的一個函數(shù)上進(jìn)行這種包裝。 接下來我們來看看debug的實(shí)現(xiàn):
Function.prototype.debug = function(debugger) { var _selfMethod = this; // 原始方法的引用 return function(){ var args = []; for (var i = 0, argsLength = arguments.length; i < argsLength; i++) { args.push(arguments[i]); } return debugger.apply(this, [_selfMethod.bind(this)].concat(args)); } };
這段代碼首先保存了原始函數(shù)的一個引用,然后將參數(shù)傳入debugger并使用apply執(zhí)行。
第一次在segmentFault寫blog,也是算對自己的一種鞭策吧,記錄一些所學(xué)習(xí)的知識,分享一寫學(xué)習(xí)的心得。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/77955.html
摘要:函數(shù)式編程是一種以函數(shù)為基礎(chǔ)的編程方式和代碼組織方式,從程序員的思路上來說,就是將程序拆分并抽象成多個函數(shù),再組裝回去。在這門語言中,函數(shù)是一等公民,函數(shù)可以作為函數(shù)的參數(shù),函數(shù)也可以返回一個函數(shù),因此適合函數(shù)式編程風(fēng)格。 函數(shù)式編程 ( Functional Programming ) 是一種以函數(shù)為基礎(chǔ)的編程方式和代碼組織方式,從程序員的思路上來說,就是將程序拆分并抽象成多個函數(shù),...
摘要:以我們的程序?yàn)槔褪且詾楫a(chǎn)生了一個名為的新類型,改類型的實(shí)現(xiàn)由給出,而就包含了通過返回的這個方法。從中找到這些類并一一執(zhí)行測試。 先以一個大牛的一段關(guān)于Python Metapgramming的著名的話來做開頭: Metaclasses are deeper magic than 99% of users should ever worry about. If you wonder ...
摘要:前言繼續(xù)向下看廖大教程,看到了函數(shù)式編程這一節(jié),當(dāng)時是覺得沒啥用直接跳過了,這次準(zhǔn)備要仔細(xì)看一遍了,并記錄下一些心得。 前言 繼續(xù)向下看廖大教程,看到了函數(shù)式編程這一節(jié),當(dāng)時是覺得沒啥用直接跳過了,這次準(zhǔn)備要仔細(xì)看一遍了,并記錄下一些心得。 函數(shù)式編程 上學(xué)期有上一門叫 人工智能 的課,老師強(qiáng)行要我們學(xué)了一個叫做 prolog 的語言,哇那感覺確實(shí)難受,思維方式完全和之前學(xué)過的不一樣,...
摘要:六文件類型與目錄結(jié)構(gòu)支持很多文件類型,其中非常重要的文件類型有普通文件,目錄文件,鏈接文件,設(shè)備文件,管道文件,套接字文件等。套接字文件套接字文件被用于網(wǎng)絡(luò)進(jìn)程之間的通信,既可以使臺不同的機(jī)器進(jìn)行通信,也可以用于本機(jī)的網(wǎng)絡(luò)程序。一、Linux簡介類Unix系統(tǒng): Linux是一種自由、開放源碼的類似Unix的操作系統(tǒng)Linux內(nèi)核: 嚴(yán)格來說,Linux這個詞本身只表示Linux內(nèi)核Linu...
閱讀 1393·2021-11-24 09:38
閱讀 2095·2021-09-22 15:17
閱讀 2393·2021-09-04 16:41
閱讀 3487·2019-08-30 15:56
閱讀 3520·2019-08-29 17:19
閱讀 1981·2019-08-28 18:09
閱讀 1258·2019-08-26 13:35
閱讀 1718·2019-08-23 17:52