摘要:枚舉對(duì)象上的實(shí)例屬性用方法原型模式優(yōu)缺點(diǎn)優(yōu)點(diǎn)不用每個(gè)方法都要在每個(gè)實(shí)例上重申一遍缺點(diǎn)很少有人多帶帶使用原型模式地。。組合使用構(gòu)造函數(shù)模式和原型模式這種模式是目前使用最廣泛認(rèn)同度最高的一種創(chuàng)建自定義類(lèi)型的方法。是用來(lái)定義引用類(lèi)型的一種默認(rèn)模式。
javascript創(chuàng)建對(duì)象方式
工廠(chǎng)模式
構(gòu)造函數(shù)模式
原型模式
工廠(chǎng)模式function createPerson(name, age){ var obj = new Object(); obj.name = name; obj.age = age; return obj; //一定要返回,否則打印undefined:undefined } var person1 = new createPerson("Young",18); console.log(person1.name + ":" + person1.age);
優(yōu)點(diǎn):工廠(chǎng)模式可以解決創(chuàng)建多個(gè)相似對(duì)象
缺點(diǎn):沒(méi)有解決對(duì)象識(shí)別問(wèn)題(怎樣確定一個(gè)對(duì)象的類(lèi)型)
構(gòu)造函數(shù)模式學(xué)習(xí)判斷對(duì)象類(lèi)型: http://www.cnblogs.com/flyjs/...
function Person(name,age){ this.name = name; this.age = age; } var person1 = new Person("Young",18); console.log(person1.name + ":" + person1.age);
在說(shuō)優(yōu)缺點(diǎn)之前,先來(lái)說(shuō)說(shuō)她本身的一點(diǎn)小故事吧
function Person(name,age){ this.name=name; this.age=age; this.sayName=function(){ return this.name; } } //當(dāng)做構(gòu)造函數(shù)使用 var person1 = new Person("Young", 18); person1.sayName(); console.log(person1.name + ":" + person1.age); //當(dāng)做普通函數(shù)調(diào)用 Person("Wind", 18); console.log(window.sayName()); //在另一個(gè)作用域中調(diào)用 var obj = new Object(); Person.call(obj, "bird", 100); console.log(obj.sayName());
優(yōu)點(diǎn):可以將它的實(shí)例標(biāo)識(shí)為一種特定類(lèi)型
缺點(diǎn):每個(gè)方法都要在每個(gè)實(shí)例上重新創(chuàng)建一遍。當(dāng)然你也可以這樣改:
function Person(name, age){ this.name = name; this.age = age; this.sayName = sayName; } function sayName(){ return this.name; }
改為調(diào)用全局函數(shù),這樣一來(lái)毫無(wú)封裝性可言。。。接下來(lái)的原型模式可以彌補(bǔ)這個(gè)的不足
原型模式function Person(){ } Person.prototype.name = "Young"; Person.prototype.age = 18; Person.prototype.sayName = function(){ return this.name; } var person1 = new Person(); console.log(person1.sayName()); var person2 = new Person(); console.log(person1.sayName()); alert(person1.sayName === person2.sayName); //person1和person2訪(fǎng)問(wèn)的是同一組屬性的同一個(gè)sayName()函數(shù)
雖然可以通過(guò)對(duì)象實(shí)例訪(fǎng)問(wèn)保存在原型中的值,但卻不能通過(guò)實(shí)例對(duì)象重寫(xiě)原型中的值
function Person(){ } Person.prototype.name="Young"; Person.prototype.age=18; Person.prototype.sayName=function(){ return this.name; } var person1=new Person(); var person2=new Person(); person1.name="Wind"; console.log(person1.sayName());//Wind console.log(person2.sayName());//Young alert(person1.sayName==person2.sayName);//true
在我們調(diào)用person1.sayName的時(shí)候,會(huì)先后執(zhí)行兩次搜索,解析器先確定實(shí)例person1是否有sayName的屬性,有則調(diào)用自己的屬性,沒(méi)有則搜索原型中的屬性。
function Person(){ } Person.prototype.name="Young"; Person.prototype.age=18; Person.prototype.sayName=function(){ return this.name; } var person1=new Person(); var person2=new Person(); person1.name="Wind"; console.log(person1.sayName());//Wind console.log(person2.sayName());//Young delete person1.name; console.log(person1.sayName());//Young console.log(person2.sayName());//Young
使用hasOwnPropertyType方法可以檢測(cè)一個(gè)屬性是存在與原型中還是存在于實(shí)例中,該方法是從Object繼承來(lái)的,實(shí)例中為true,原型中為false。
function Person(){ } Person.prototype.name="Young"; Person.prototype.age=18; Person.prototype.sayName=function(){ return this.name; } var keys=Object.keys(Person.prototype); console.log(keys);//["name", "age", "sayName"]
原型模式優(yōu)缺點(diǎn)
優(yōu)點(diǎn):不用每個(gè)方法都要在每個(gè)實(shí)例上重申一遍
缺點(diǎn):很少有人多帶帶使用原型模式地。。問(wèn)題詳列
function Person(){ } Person.prototype={ constructor:Person, name:"Young", age:18, friends:["Big","Pig"], sayName:function(){ return this.name; } }; var p1=new Person(); var p2=new Person(); p1.friends.push("Mon"); console.log(p1.friends);//["Big", "Pig", "Mon"] console.log(p2.friends);//["Big", "Pig", "Mon"]
正是因?yàn)閷?shí)例一般都要有自己的屬性,而我們這里將他放在了Person.prototype中,所以隨著p1的修改,整個(gè)實(shí)例包括原型都修改了。那么,我們可以組合使用構(gòu)造函數(shù)模式和原型模式。
組合使用構(gòu)造函數(shù)模式和原型模式function Person(name,age){ this.name=name; this.age=age; this.friends=["Big","Pig"]; } Person.prototype={ sayName:function(){ return this.name; } }; var p1=new Person("Young",18); var p2=new Person("Wind",78); p1.friends.push("Raganya"); console.log(p1.friends);//["Big", "Pig", "Raganya"] console.log(p2.friends);//["Big", "Pig"] console.log(p1.friends==p2.friends);//false console.log(p1.sayName==p2.sayName);//true
這種模式是目前使用最廣泛、認(rèn)同度最高的一種創(chuàng)建自定義類(lèi)型的方法。是用來(lái)定義引用類(lèi)型的一種默認(rèn)模式。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/87854.html
摘要:我們有了構(gòu)造函數(shù)之后,第二步開(kāi)始使用它構(gòu)造一個(gè)函數(shù)。來(lái)個(gè)例子這種方式很簡(jiǎn)單也很直接,你在構(gòu)造函數(shù)的原型上定義方法,那么用該構(gòu)造函數(shù)實(shí)例化出來(lái)的對(duì)象都可以通過(guò)原型繼承鏈訪(fǎng)問(wèn)到定義在構(gòu)造函數(shù)原型上的方法。 來(lái)源: 個(gè)人博客 白話(huà)解釋 Javascript 原型繼承(prototype inheritance) 什么是繼承? 學(xué)過(guò)面向?qū)ο蟮耐瑢W(xué)們是否還記得,老師整天掛在嘴邊的面向?qū)ο笕筇?..
摘要:在中函數(shù)是一等對(duì)象,它們不被聲明為任何東西的一部分,而所引用的對(duì)象稱(chēng)為函數(shù)上下文并不是由聲明函數(shù)的方式?jīng)Q定的,而是由調(diào)用函數(shù)的方式?jīng)Q定的。更為準(zhǔn)確的表述應(yīng)該為當(dāng)對(duì)象充當(dāng)函數(shù)的調(diào)用函數(shù)上下文時(shí),函數(shù)就充當(dāng)了對(duì)象的方法。 引言:當(dāng)理解了對(duì)象和函數(shù)的基本概念,你可能會(huì)發(fā)現(xiàn),在JavaScript中有很多原以為理所當(dāng)然(或盲目接受)的事情開(kāi)始變得更有意義了。 1.JavaScript...
摘要:對(duì)象的分類(lèi)內(nèi)置對(duì)象原生對(duì)象就是語(yǔ)言預(yù)定義的對(duì)象,在標(biāo)準(zhǔn)定義,有解釋器引擎提供具體實(shí)現(xiàn)宿主對(duì)象指的是運(yùn)行環(huán)境提供的對(duì)象。不過(guò)類(lèi)型是中所有類(lèi)型的父級(jí)所有類(lèi)型的對(duì)象都可以使用的屬性和方法,可以通過(guò)的構(gòu)造函數(shù)來(lái)創(chuàng)建自定義對(duì)象。 對(duì)象 javaScript中的對(duì)象,和其它編程語(yǔ)言中的對(duì)象一樣,可以比照現(xiàn)實(shí)生活中的對(duì)象來(lái)理解。在JavaScript中,一個(gè)對(duì)象可以是一個(gè)單獨(dú)擁有屬性和類(lèi)型的實(shí)體。和...
摘要:對(duì)象在中,除了數(shù)字字符串布爾值這幾個(gè)簡(jiǎn)單類(lèi)型外,其他的都是對(duì)象。那么在函數(shù)對(duì)象中,這兩個(gè)屬性的有什么區(qū)別呢表示該函數(shù)對(duì)象的原型表示使用來(lái)執(zhí)行該函數(shù)時(shí)這種函數(shù)一般成為構(gòu)造函數(shù),后面會(huì)講解,新創(chuàng)建的對(duì)象的原型。這時(shí)的函數(shù)通常稱(chēng)為構(gòu)造函數(shù)。。 本文原發(fā)于我的個(gè)人博客,經(jīng)多次修改后發(fā)到sf上。本文仍在不斷修改中,最新版請(qǐng)?jiān)L問(wèn)個(gè)人博客。 最近工作一直在用nodejs做開(kāi)發(fā),有了nodejs,...
摘要:對(duì)象重新認(rèn)識(shí)面向?qū)ο竺嫦驅(qū)ο髲脑O(shè)計(jì)模式上看,對(duì)象是計(jì)算機(jī)抽象現(xiàn)實(shí)世界的一種方式。除了字面式聲明方式之外,允許通過(guò)構(gòu)造器創(chuàng)建對(duì)象。每個(gè)構(gòu)造器實(shí)際上是一個(gè)函數(shù)對(duì)象該函數(shù)對(duì)象含有一個(gè)屬性用于實(shí)現(xiàn)基于原型的繼承和共享屬性。 title: JS對(duì)象(1)重新認(rèn)識(shí)面向?qū)ο? date: 2016-10-05 tags: JavaScript 0x00 面向?qū)ο?從設(shè)計(jì)模式上看,對(duì)象是...
摘要:在最開(kāi)始的時(shí)候,原型對(duì)象的設(shè)計(jì)主要是為了獲取對(duì)象的構(gòu)造函數(shù)。同理數(shù)組通過(guò)調(diào)用函數(shù)通過(guò)調(diào)用原型鏈中描述了原型鏈的概念,并將原型鏈作為實(shí)現(xiàn)繼承的主要方法。 對(duì)象的創(chuàng)建 在JavaScript中創(chuàng)建一個(gè)對(duì)象有三種方式??梢酝ㄟ^(guò)對(duì)象直接量、關(guān)鍵字new和Object.create()函數(shù)來(lái)創(chuàng)建對(duì)象。 1. 對(duì)象直接量 創(chuàng)建對(duì)象最直接的方式就是在JavaScript代碼中使用對(duì)象直接量。在ES5...
閱讀 1786·2021-11-16 11:44
閱讀 2483·2021-10-11 11:07
閱讀 4277·2021-10-09 09:41
閱讀 740·2021-09-22 15:52
閱讀 3278·2021-09-09 09:33
閱讀 2822·2019-08-30 15:55
閱讀 2336·2019-08-30 15:55
閱讀 895·2019-08-30 15:55