日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

JavaScript中定義對象的四種方式

 CevenCheng 2012-04-29
    最近在閱讀《 JavaScript 高級程序設(shè)計》,未免遺忘讀過的內(nèi)容,就打算以博客的形式做些讀書筆記。今天介紹的是 JavaScript 中的四種定義對象的方法,除了這四種方法,還有工廠方法來定義對象,但考慮到其簡單性及非正規(guī)性,這里就不做介紹。和 Java 這樣的面向?qū)ο笳Z言相比, JavaScript 更像是函數(shù)式語言,其并沒有類的概念,蓋之以對象定義的概念,而具體創(chuàng)建的對象叫做對象的實(shí)例。 
    1)構(gòu)造函數(shù)方式定義對象。 這種方式是在構(gòu)造函數(shù)內(nèi)定義屬性和方法。這里舉個簡單的例子:
   
function Animal(name){
        this.name = name;
        this.introduceSelf = function(){
            window.alert("I am a " + this.name+"!");
        };
}
    對象的實(shí)例化如下:
var dog = new Animal("dog");
dog. introduceSelf();
    當(dāng)然,
 
也可以將對象的方法在構(gòu)造函數(shù)外定義,如下所示:
function introduceSelf(){
    window.alert(
"I am a " + this.name+"!");
}
    
function Animal(name){
    
this.name = name;
    
this.introduceSelf = introduceSelf();
}
   
這種在構(gòu)造函數(shù)內(nèi)定義所有的屬性和方法的方式,使得構(gòu)造函數(shù)相當(dāng)于 Java 中類的概念。而將方法的具體定義獨(dú)立地放在構(gòu)造函數(shù)外,會使得對象的定義和方法的定義并不緊密,如果在一個文件中這樣的方法和對象定義多的話,就會看起來凌亂許多。

    2)
 原型方式。 該方式利用對象的 prototype 屬性,可以將其看成創(chuàng)建新對象所依賴的原型(關(guān)于 
prototype 的詳細(xì)信息,可以百度一下,這方面的資料還是很多的)。這種方式將構(gòu)造函數(shù)做成空構(gòu)造函數(shù),然后將所有的屬性和方法被直接賦予 prototype 屬性,還是前面的例子,重寫如下:
   
function Animal(){
    
}
Animal.prototype.name = "animal";
Animal.prototype.introduceSelf = function(){
    window.alert("I am a " + this.name+"!");
};
//對象的實(shí)例如下:
var dog = new Animal();
dog.name = "dog";
dog.introductSelf();
   
這種方式的缺點(diǎn)是顯而易見的,就是不能在構(gòu)造函數(shù)中對屬性進(jìn)行賦值操作。還有一點(diǎn)是,對于引用類型的屬性(如 Array 實(shí)例),實(shí)例化的多個對象將共享一個引用。正因為這么多的問題,這種對象定義的方式并不可取。

    3)
 構(gòu)造函數(shù)、原型混合方式。 這種方式是最為流行的對象定義方式。它結(jié)合了構(gòu)造函數(shù)及原型方式。這種方式用構(gòu)造函數(shù)定義對象的所有非函數(shù)屬性,用原型方式定義對象的函數(shù)屬性(方法)。重寫前面的例子:
function Animal(name){
    
this.name = name;
}
Animal.prototype.introduceSelf 
= function(){
    window.alert(
"I am a " + this.name+"!");
};
    
    4)
 動態(tài)原型方式。 和構(gòu)造函數(shù)、原型混合方式相比,動態(tài)原型方式只是在函數(shù)屬性定義的位置上有所不同。重寫前面的例子: 

   
function  Animal(name){
    
 this .name  =  name;
    
 if ( typeof  Animal._initialized  ==  'undefined'){
        Animal.prototype.introduceSelf 
 =   function (){
            window.alert(
 " I am a  "   +   this .name + " ! " );
        };
        Animal._initialized 
 =   true ;
    }
}
      其中_initializedAnimal的全局私有屬性(JavaScript中沒有私有屬性的概念,所有的屬性都是共有的,但為了表明一些屬性的私有特性,人們習(xí)慣在屬性名前加上“_”。),當(dāng)?shù)谝淮螌?shí)例化Animal時,if條件就為真,這樣就會定義Animal中的函數(shù)屬性。由于“Animal._initialized = true;”的存在,函數(shù)的定義調(diào)用一次而無論實(shí)例化多少個對象。

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多