天天看點

初次接觸面向對象的javascript

一、對象作用域

function ClassA(){
    var v = "我是變量 v";
    this.v = "我是屬性 v";
    var me = this;
    
    ClassA.prototype.F = function(){
        alert("我是可供外部通路的函數");
    }
    function _F(){
        alert("我隻是一個内部函數,外部不能通路我。");
    }
    ClassA.prototype.F2 = function(){
        alert(v);       //OK
        alert(this.v);  //OK
        _F();           //OK
        F();            //錯
        this.F();       //OK
    }    
    function _F2(){
        F();            //錯
        this.F();       //錯
        me.F();         //OK
    }
}
var objA = new ClassA();
alert(objA.v);          //顯示“我是屬性 v”
objA.F2();              
objA._F2();             //系統報錯,提示缺少對象      

二、改寫

function ClassA(){
    var v = "我是變量 v";
    this.v = "我是屬性 v";
    
    if (typeof ClassA._initialized == "undefined"){
        ClassA.prototype.F = function(){
            alert("我是可供外部通路的函數");
        }
        ClassA._initialized = true;
    }
        
    function _F(){
        alert("我隻是一個内部函數,外部不能通路我。");
    }    
}
var objA = new ClassA();
objA.v = "我是屬性 v,現在被重新指派鳥";
ClassA.prototype.F = function(){
            alert("我是可供外部通路的函數,現在被改寫鳥");
        }
alert(objA.v);          //顯示“我是屬性 v,現在被重新指派鳥”
objA.F();               //顯示"我是可供外部通路的函數,現在被改寫鳥"      
function ClassA(){
    this.v = "我是屬性 v";

    if (typeof ClassA._initialized == "undefined"){
        ClassA.prototype.F = function(){
            alert("我是可供外部通路的靜态函數 F");
        }
        ClassA._initialized = true;
    }
    
    this.F2 = function(){
        alert("我是可供外部通路的函數 F2");
    }
}
var objA1 = new ClassA();
var objA2 = new ClassA();
ClassA.prototype.F = function(){
            alert("我是可供外部通路的靜态函數 F,被修改鳥。");
        }
objA1.F2 = function(){
        alert("我是可供外部通路的函數 F2,被 objA1 修改鳥");
    }
objA1.F();  //我是可供外部通路的靜态函數 F,被修改鳥。
objA2.F();  //我是可供外部通路的靜态函數 F,被修改鳥。
objA1.F2(); //我是可供外部通路的函數 F2,被 objA1 修改鳥
objA2.F2(); //我是可供外部通路的函數 F2      

三、繼承

function ClassA(){
    this.vA = "我是 ClassA 的屬性 vA";

    if (typeof ClassA._initialized == "undefined"){
        ClassA.prototype.F = function(){
            alert("我是 ClassA 可供外部通路的靜态函數 F");
        }
        ClassA._initialized = true;
    }
    
    this.F2 = function(){
        alert("我是可供外部通路的函數 F2");
    }
}

function ClassB(){
    this.vB = "我是 ClassB 的屬性 vB";
}
ClassB.prototype = new ClassA();

var objA = new ClassA();
var objB = new ClassB();
alert(objB.vA);     //我是 ClassA 的屬性 vA
alert(objB.vB);     //我是 ClassB 的屬性 vB
objB.F();           //我是 ClassA 可供外部通路的靜态函數 F
objB.F2();          //我是可供外部通路的函數 F2
ClassB.prototype.F = function(){
            alert("我是 ClassA 可供外部通路的靜态函數 F,被 ClassB 修改鳥。");
        }
objA.F();           //我是 ClassA 可供外部通路的靜态函數 F
objB.F();           //我是 ClassA 可供外部通路的靜态函數 F,被 ClassB 修改鳥。