成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Javascript 元編程初探 [1]

mcterry / 1087人閱讀

摘要:在這里講到的很多也許只和程序?qū)τ诠ぷ鳈C(jī)制的操作有關(guān),但是作為初探也許也就足夠了。一般情況下還有空字符串都會被判斷成。面向特征編程面向特征編程的全稱是。

引子

元編程會有如下的定義:

一種計(jì)算機(jī)程序的編寫方式,它可以將其它程序(或者其本身)作為數(shù)據(jù)進(jìn)行編寫和操作,或者在編譯時做一部分工作,在運(yù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

相關(guān)文章

  • WebGL 初探

    摘要:下面是頂點(diǎn)及片元著色器程序,用字符串表示,它將直接運(yùn)行在瀏覽器之上。最后,使用將和著色器連接。創(chuàng)建著色器對象創(chuàng)建編程對象賦值已創(chuàng)建的著色器對象連接編程對象檢查鏈接結(jié)果鏈接程序失敗使用可用著色器程序這一步主要使用方法告訴使用程序。 該文章于一天前發(fā)表在 github,若有問題可提至 github。 目前,我們有很多方案可以快速的接觸到 WebGL 并繪制復(fù)雜的圖形,但最后發(fā)現(xiàn)我們忽視了很...

    whjin 評論0 收藏0
  • 函數(shù)式編程初探

    摘要:函數(shù)式編程是一種以函數(shù)為基礎(chǔ)的編程方式和代碼組織方式,從程序員的思路上來說,就是將程序拆分并抽象成多個函數(shù),再組裝回去。在這門語言中,函數(shù)是一等公民,函數(shù)可以作為函數(shù)的參數(shù),函數(shù)也可以返回一個函數(shù),因此適合函數(shù)式編程風(fēng)格。 函數(shù)式編程 ( Functional Programming ) 是一種以函數(shù)為基礎(chǔ)的編程方式和代碼組織方式,從程序員的思路上來說,就是將程序拆分并抽象成多個函數(shù),...

    oogh 評論0 收藏0
  • Python Metaclass 初探

    摘要:以我們的程序?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 ...

    nidaye 評論0 收藏0
  • [python] 初探'函數(shù)式編程'

    摘要:前言繼續(xù)向下看廖大教程,看到了函數(shù)式編程這一節(jié),當(dāng)時是覺得沒啥用直接跳過了,這次準(zhǔn)備要仔細(xì)看一遍了,并記錄下一些心得。 前言 繼續(xù)向下看廖大教程,看到了函數(shù)式編程這一節(jié),當(dāng)時是覺得沒啥用直接跳過了,這次準(zhǔn)備要仔細(xì)看一遍了,并記錄下一些心得。 函數(shù)式編程 上學(xué)期有上一門叫 人工智能 的課,老師強(qiáng)行要我們學(xué)了一個叫做 prolog 的語言,哇那感覺確實(shí)難受,思維方式完全和之前學(xué)過的不一樣,...

    xcc3641 評論0 收藏0
  • 初探Linux---Linux文件系統(tǒng)概覽

    摘要:六文件類型與目錄結(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...

    Tecode 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<