javascript設計モード-装飾者モード(9)


装飾者はオブジェクトに新しい特性を付加する技術であり、新しいサブクラスを作成するこの手段は適用されません.装飾者モードは、オブジェクトを同じインターフェースを持つ別のオブジェクトに透明に包装するために使用されてもよい.これにより、オブジェクトに方法またはいくつかの挙動を追加し、方法を呼び出して元のオブジェクトに渡すことができます.
//     :                ,             
//       
//     

var CarInterface = new BH.Interface('CarInterface' , ['getPrice' , 'assemble']);
var Car = function(car){
     
    //          (            )
    this.car = car ; 
    //    
    BH.Interface.ensureImplements(this , CarInterface);
};
Car.prototype = {
    constructor :Car,
    getPrice:function(){
     
        return 200000 ; 
    },
    assemble:function(){
     
        document.write('    ...');
    }
};

//    :light、icebox .......

 var LightDecorator = function(car){
      //    
    //        
    LightDecorator.superClass.constructor.call(this , car);
 };
 BH.extend(LightDecorator , Car);  //     

 LightDecorator.prototype = {
    constructor:LightDecorator , 
    getPrice:function(){
     
        return  this.car.getPrice() + 10000; 
    },
    assemble:function(){
     
        document.write('    ...');
    }                   
 };

 var IceBoxDecorator = function(car){
     
    //        
    IceBoxDecorator.superClass.constructor.call(this , car);                    
 };
 BH.extend(IceBoxDecorator , Car);  //     

 IceBoxDecorator.prototype = {
    constructor:IceBoxDecorator , 
    getPrice:function(){
     
        return  this.car.getPrice() + 20000;  
    },
    assemble:function(){
     
        document.write('      ...');
    }                   
 };
父類の中のthis.car=carは掛け布団類を継承します.サブクラスではthis.carを使うのが父類のcarの引用です.
//            ,          
//                
function getDate(){
     
    return (new Date()).toString();
};

//      (     )
function upperCaseDecorator(fn){
     
    return function(){
     
        return fn.apply(this, arguments).toUpperCase();
    }
};

alert(getDate());
var getDecoratorDate = upperCaseDecorator(getDate);
alert(getDecoratorDate());