摘要:對(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),也可以是用戶自定義的.
所有的對(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ì)象.
工廠模式是軟件工廠領(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ì)象.
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)建一個(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ù)模式原型模式.
通過(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
摘要:用代碼可以這樣描述安全到達(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ì)象。我們就要一些屬性,比...
摘要:很多情況下,通常一個(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); 馬上就要到七夕了,離年底老媽老爸...
摘要:很多情況下,通常一個(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); 馬上就要到七夕了,離年底老媽老爸...
摘要:很多情況下,通常一個(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); 馬上就要到七夕了,離年底老媽老爸...
摘要:面向?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)...
摘要:可以用刪除實(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í)例共享的屬性和方法。 ------------...
閱讀 1973·2023-04-26 01:59
閱讀 3276·2021-10-11 11:07
閱讀 3307·2021-09-22 15:43
閱讀 3388·2021-09-02 15:21
閱讀 2572·2021-09-01 10:49
閱讀 912·2019-08-29 15:15
閱讀 3100·2019-08-29 13:59
閱讀 2839·2019-08-26 13:36