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

資訊專欄INFORMATION COLUMN

面向?qū)ο蟮某绦蛟O(shè)計(jì)之創(chuàng)建對(duì)象

acrazing / 711人閱讀

摘要:對(duì)象的定義無(wú)序?qū)傩缘募蠈傩缘闹悼梢允腔局祵?duì)象或者函數(shù)每個(gè)對(duì)象都是基于一個(gè)應(yīng)用類型創(chuàng)建的這個(gè)引用類型可以是內(nèi)置的例如也可以是用戶自定義的基于創(chuàng)建對(duì)象所有的對(duì)象都是繼承自的因此我們可以從著手創(chuàng)建對(duì)象通過(guò)關(guān)鍵字創(chuàng)建對(duì)象通過(guò)對(duì)象字面量創(chuàng)建對(duì)象基

對(duì)象的定義:無(wú)序?qū)傩缘募?屬性的值可以是基本值、對(duì)象或者函數(shù).
每個(gè)對(duì)象都是基于一個(gè)應(yīng)用類型創(chuàng)建的,這個(gè)引用類型可以是內(nèi)置的(例如Object Array Math),也可以是用戶自定義的.

基于Object創(chuàng)建對(duì)象

所有的對(duì)象都是繼承自O(shè)bject的,因此我們可以從Object著手創(chuàng)建對(duì)象.

//通過(guò)new 關(guān)鍵字創(chuàng)建對(duì)象
var person = new Ojbect();
person.name = "yuhualinfeng";
person.age = 30;
person.job = "web developer";

//通過(guò)對(duì)象字面量創(chuàng)建對(duì)象
var person = {};
person.name = "yuhualinfeng";
person.age = 30;
person.job = "web developer";

基于Object創(chuàng)建對(duì)象有兩種形式,一種是使用new關(guān)鍵字,另一種是使用對(duì)象字面量.
使用這種方式創(chuàng)建對(duì)象的缺點(diǎn)是:當(dāng)創(chuàng)建多個(gè)相同類型的對(duì)象時(shí),會(huì)產(chǎn)生許多重復(fù)的代碼,假如我要三個(gè)person對(duì)象,我就需要寫(xiě)三相同結(jié)構(gòu)的代碼,為了解決這個(gè)問(wèn)題,我們引入了工廠模式創(chuàng)建對(duì)象.

使用工廠模式創(chuàng)建對(duì)象

工廠模式是軟件工廠領(lǐng)域一種廣為認(rèn)知的設(shè)計(jì)模式,這種模式抽象了創(chuàng)建具體對(duì)象的過(guò)程.

function createPerson(name,age,job){

var obj = new Object();
obj.name = name;
obj.age = age;
obj.job = job;

return obj;

}

var person1 = createPerson("yuhualingfeng",30,"web developer");
var person2 = createPerson("obama",45,"president");

我們創(chuàng)建了兩個(gè)人物對(duì)象,假如我們基于Object創(chuàng)建對(duì)象,那么createPerson內(nèi)的代碼就會(huì)重復(fù)編碼.
但是使用這種模式創(chuàng)建的對(duì)象任然有一個(gè)問(wèn)題:無(wú)法得知?jiǎng)?chuàng)建的對(duì)象的類型名.解決這問(wèn)題的可行方法是使用構(gòu)造函數(shù)創(chuàng)建對(duì)象.

使用構(gòu)造函數(shù)模式創(chuàng)建對(duì)象
function Person(name,age,job){

    this.name = name;
    this.age = age;
    this.job = job;

    this.sayName = function(){
        alert(this.name);
    }

}

var person1 = new Person("yuhualingfeng",30,"web developer");
var person2 = new Person("obama","45","president");

這里我們創(chuàng)建了一個(gè)名為Person的引用類型,然后我們用new 關(guān)鍵字實(shí)例化此引用類型,這個(gè)過(guò)程可以細(xì)化為以下四個(gè)過(guò)程:

創(chuàng)建一個(gè)新對(duì)象

將構(gòu)造函數(shù)的作用域賦值給新函數(shù)(因此this就指向這個(gè)新對(duì)象)

執(zhí)行構(gòu)造函數(shù)中的代碼(為this對(duì)象賦值,等同于為新對(duì)象賦值)

返回新對(duì)象

我們可以用instanceof來(lái)檢測(cè)person1,person2的對(duì)象類型是否為Person.

 
 alert(person1 instanceof Person); //true
 alert(person2 instanceof Person); //true
 alert(person1 instanceof Object); //true 因?yàn)镻erson繼承自O(shè)bject,所以這里一樣成立.
  

注:細(xì)心的朋友應(yīng)該會(huì)注意到,這里的構(gòu)造函數(shù)的首字母是大寫(xiě),這里們遵循一個(gè)規(guī)范,普通函數(shù)的首字母大寫(xiě),普通函數(shù)的首字母小寫(xiě).

構(gòu)造函數(shù)也有自己的缺點(diǎn),大家可以看到Person包含一個(gè)sayName的函數(shù)(方法),函數(shù)也是對(duì)象(函數(shù)式Function的實(shí)例),所以每實(shí)例化一個(gè)Person,就會(huì)產(chǎn)生一個(gè)sayName方法,也就是一個(gè)對(duì)象,
隨著創(chuàng)建的person實(shí)例怎多,產(chǎn)生的對(duì)象也相應(yīng)增多,最終導(dǎo)致更多的內(nèi)存,那么我們能不能找到更好的解決辦法呢,答案是肯定的.

使用原型模式創(chuàng)建對(duì)象

我們每創(chuàng)建一個(gè)函數(shù)都有一個(gè)prototype(原型)屬性,這個(gè)屬性是一個(gè)指針,指向一個(gè)對(duì)象而這個(gè)特定對(duì)象的用途是包含可以由特定類型的所有實(shí)例共享的屬性和方法.這就意味著原型對(duì)象不會(huì)因?yàn)閷?shí)例的增多二占用
更多的內(nèi)存.每個(gè)原型對(duì)象都默認(rèn)有一個(gè)constructor屬性,故名思議,這個(gè)屬性指向構(gòu)造函數(shù).下面展示了通過(guò)原型對(duì)象來(lái)創(chuàng)建對(duì)象.

function Person(){
}
Person.prototype.name = "yuhualingfeng";

Person.prototype.age = 30;

Person.prototype.job = "web developer";

Person.prototype.sayName=function(){
alert(this.name);
};

var person1 = new Person();
person.sayName();  //yuhualingfeng
var person2 = new Person();

這里Person.prototype.constructor指向的是Person.當(dāng)然你也可以向下面這樣直接給原型對(duì)象賦值來(lái)創(chuàng)建對(duì)象.

Person.prototype={
constructor:Person,
name:"yuhualingfeng",
age:30,
job:"web developer"
};

這里之所以添加了constructor屬性是應(yīng)為直接給原型對(duì)象賦值會(huì)把原型對(duì)象的指針指向另一個(gè)對(duì)象,以前默認(rèn)的值將無(wú)法訪問(wèn)到.

順便給大家介紹兩個(gè)與原型對(duì)象相關(guān)的方法和in關(guān)鍵字:

isPrototypeOf:判斷是某對(duì)象否為實(shí)例的原型.

alert(Person.prototype.isPrototypeOf(person));  //true

hasOwnProperty:檢測(cè)某屬性是存在于實(shí)例中,還是原型對(duì)象中.

alert(person1.hasOwnProperty("name"));  //false,因?yàn)閷傩源嬖谟谠椭?

in操作符:in操作符有兩種使用方式,一種是多帶帶使用,一種是和for搭配使用,多帶帶使用的作用是判斷某屬性是否在某實(shí)例中訪問(wèn)到(無(wú)論是在實(shí)例自身的還是原型對(duì)象中的),for-in是枚舉(循環(huán))中使用.

//判斷屬性是否存在原型中
function hasPrototypeProperty(object,name){

    return object.hasOwnProperty(name) && (name in object);

}

原型模式創(chuàng)建對(duì)象的缺點(diǎn):實(shí)例的原型對(duì)象是共享的,當(dāng)修改一個(gè)實(shí)例的屬性,如果屬性的值為方法或者基本類型時(shí),不會(huì)有什么影響,當(dāng)屬性為引用類型時(shí),會(huì)影響其他實(shí)例的屬性值.
綜合構(gòu)造函數(shù)模式和原型模式創(chuàng)建對(duì)象,我們結(jié)合他們的優(yōu)點(diǎn),去粗取精,我們組合使用構(gòu)造函數(shù)模式原型模式.

組合使用構(gòu)造函數(shù)模式原型模式

通過(guò)構(gòu)造函數(shù)創(chuàng)建對(duì)象的缺點(diǎn)是每個(gè)方法都會(huì)在實(shí)例上重新創(chuàng)建,造成不必要的內(nèi)存消耗;通過(guò)原型創(chuàng)建對(duì)象的缺點(diǎn)在于實(shí)例引用類型值的屬性會(huì)相互影響.綜上考慮,我們可以把存儲(chǔ)值得屬性放在構(gòu)造函數(shù)中,把方法放在原型對(duì)象中.這種模式是創(chuàng)建對(duì)象使用最廣泛的一種,可以說(shuō)是創(chuàng)建對(duì)象的默認(rèn)模式.

function Person(name,age,job){
    this.name = name;
    this.age = age;
    this.job = job;
}

Person.prototype = {
 constuctor:Person,
 sayName:function(){
     alert(this.name);
 }
};

var person = new Person("yuhualingfeng",30,"web developer");
person.sayName();  

以上就是創(chuàng)建對(duì)象的幾種模式,大家可以結(jié)合它們的優(yōu)缺點(diǎn)和你自身創(chuàng)建對(duì)象的用處進(jìn)行權(quán)衡,然后選擇適合你的創(chuàng)建對(duì)象的模式.

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/86014.html

相關(guān)文章

  • javascript 面向對(duì)象版塊理解對(duì)象

    摘要:用代碼可以這樣描述安全到達(dá)國(guó)外面向過(guò)程既然說(shuō)了面向?qū)ο?,那么與之對(duì)應(yīng)的就是面向過(guò)程。小結(jié)在這篇文章中,介紹了什么是面向?qū)ο蠛兔嫦蜻^(guò)程,以及中對(duì)象的含義。 這是 javascript 面向?qū)ο蟀鎵K的第一篇文章,主要講解對(duì)面向?qū)ο笏枷氲囊粋€(gè)理解。先說(shuō)說(shuō)什么是對(duì)象,其實(shí)這個(gè)還真的不好說(shuō)。我們可以把自己當(dāng)成一個(gè)對(duì)象,或者過(guò)年的時(shí)候相親,找對(duì)象,那么你未來(lái)的老婆也是一個(gè)對(duì)象。我們就要一些屬性,比...

    lovXin 評(píng)論0 收藏0
  • SegmentFault 技術(shù)周刊 Vol.32 - 七夕將至,你對(duì)象”還好嗎?

    摘要:很多情況下,通常一個(gè)人類,即創(chuàng)建了一個(gè)具體的對(duì)象。對(duì)象就是數(shù)據(jù),對(duì)象本身不包含方法。類是相似對(duì)象的描述,稱為類的定義,是該類對(duì)象的藍(lán)圖或原型。在中,對(duì)象通過(guò)對(duì)類的實(shí)體化形成的對(duì)象。一類的對(duì)象抽取出來(lái)。注意中,對(duì)象一定是通過(guò)類的實(shí)例化來(lái)的。 showImg(https://segmentfault.com/img/bVTJ3H?w=900&h=385); 馬上就要到七夕了,離年底老媽老爸...

    李昌杰 評(píng)論0 收藏0
  • SegmentFault 技術(shù)周刊 Vol.32 - 七夕將至,你對(duì)象”還好嗎?

    摘要:很多情況下,通常一個(gè)人類,即創(chuàng)建了一個(gè)具體的對(duì)象。對(duì)象就是數(shù)據(jù),對(duì)象本身不包含方法。類是相似對(duì)象的描述,稱為類的定義,是該類對(duì)象的藍(lán)圖或原型。在中,對(duì)象通過(guò)對(duì)類的實(shí)體化形成的對(duì)象。一類的對(duì)象抽取出來(lái)。注意中,對(duì)象一定是通過(guò)類的實(shí)例化來(lái)的。 showImg(https://segmentfault.com/img/bVTJ3H?w=900&h=385); 馬上就要到七夕了,離年底老媽老爸...

    Lyux 評(píng)論0 收藏0
  • SegmentFault 技術(shù)周刊 Vol.32 - 七夕將至,你對(duì)象”還好嗎?

    摘要:很多情況下,通常一個(gè)人類,即創(chuàng)建了一個(gè)具體的對(duì)象。對(duì)象就是數(shù)據(jù),對(duì)象本身不包含方法。類是相似對(duì)象的描述,稱為類的定義,是該類對(duì)象的藍(lán)圖或原型。在中,對(duì)象通過(guò)對(duì)類的實(shí)體化形成的對(duì)象。一類的對(duì)象抽取出來(lái)。注意中,對(duì)象一定是通過(guò)類的實(shí)例化來(lái)的。 showImg(https://segmentfault.com/img/bVTJ3H?w=900&h=385); 馬上就要到七夕了,離年底老媽老爸...

    AaronYuan 評(píng)論0 收藏0
  • JS面向對(duì)象四 【new】 (創(chuàng)建特定對(duì)象語(yǔ)法糖)

    摘要:面向?qū)ο笾膭?chuàng)建特定對(duì)象的語(yǔ)法糖個(gè)人學(xué)習(xí)筆記分享為了講清楚面向?qū)ο髮?shí)際上是需要幾個(gè)前置知識(shí)的。于是之父創(chuàng)造了這個(gè)語(yǔ)法糖。 JS面向?qū)ο笾?【new】 (創(chuàng)建特定對(duì)象的語(yǔ)法糖) 個(gè)人學(xué)習(xí)筆記分享 為了講清楚面向?qū)ο?實(shí)際上是需要幾個(gè)前置知識(shí)的。包括前面的幾篇文章【原型鏈】 【this】 和今天要說(shuō)的【new】 還是先說(shuō)結(jié)論: new只是一個(gè)語(yǔ)法糖,這個(gè)語(yǔ)法糖被設(shè)計(jì)出來(lái),使用場(chǎng)景是批量創(chuàng)...

    lauren_liuling 評(píng)論0 收藏0
  • 面向對(duì)象程序設(shè)計(jì)原型模式

    摘要:可以用刪除實(shí)例對(duì)象中自己添加的屬性可以確定屬性是原型中還是實(shí)例對(duì)象中,當(dāng)時(shí)實(shí)例對(duì)象中時(shí),返回的是操作符,有兩種使用方式,單獨(dú)使用和循環(huán)中。單獨(dú)使用,通過(guò)對(duì)象能夠訪問(wèn)屬性時(shí)返回,無(wú)論時(shí)在原型中還是實(shí)例對(duì)象中。 原型模式,每個(gè)創(chuàng)建的對(duì)象都有一個(gè)prototype屬性,這個(gè)屬性是一個(gè)指針,指向一個(gè)對(duì)象,而這個(gè)對(duì)象的用途是包含可以由特定類型的所有實(shí)例共享的屬性和方法。 ------------...

    yunhao 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<