文章出處

今天突然想玩玩裝飾者模式。

這個模式行為是,給對象加一個新方法,在不改變對象原因有方法的基礎上。

網上找到的示例代碼如下:

function ABicycle(){ }
ABicycle.prototype = {
    wash : function(){ },
    ride : function(){ },
    getPrice : function(){ 
        return 999; 
    }
}

function bicycleBell( bicycle ){
    var price= bicycle.getPrice();

    bicycle.bell = function(){
        console.log("ding! ding! ding!");
    };

    bicycle.getPrice = function(){
            return price + 100;
    };
    return bicycle;
}

var bicycleA = new ABicycle();
bicycleA = bicycleBell( bicycleA );

 

我異想天開,想用函數的方法,且改變函數的原有結構。

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title>裝飾者模式——函數式寫法</title>
        <script type="text/javascript">
            function a1(){
                return 3;
            }
            
            function addA(aFn){
                var c= aFn();
                aFn = function(){
                    return c + 2;
                }

            }
            
//            function addA(aFn){
//                var c= aFn();
//
//                var aFnName = aFn.name;
//                eval(aFnName +' = function(){return c + 2;}');
//
//            }
//            
            console.log(a1());
            addA(a1);
            console.log(a1());
        </script>
    </head>
    <body>
        
    </body>
</html>

代碼執行,當然不行啦,因為函數和數字,字符串一樣都是值傳遞。倒是數組,對象是引用傳遞。

用邪惡的eval,把注釋去掉,就可以啦。

這樣的做法,挺壞。會使得程序不好預測。

 


文章列表


不含病毒。www.avast.com
全站熱搜
創作者介紹
創作者 大師兄 的頭像
大師兄

IT工程師數位筆記本

大師兄 發表在 痞客邦 留言(0) 人氣()