日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 前端技术 > javascript >内容正文

javascript

JavaScript实现创建自定义对象的常用方式总结

發(fā)布時(shí)間:2024/9/21 javascript 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JavaScript实现创建自定义对象的常用方式总结 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

2019獨(dú)角獸企業(yè)重金招聘Python工程師標(biāo)準(zhǔn)>>>

1. 對(duì)象字面量方式
對(duì)象字面量方式是創(chuàng)建自定義對(duì)象的首選模式,簡(jiǎn)單方便。

var per = { name:'zhangsan', age:25, job:'html', sayName:function(){ alert(this.name); } }

**缺點(diǎn):**使用同一個(gè)接口創(chuàng)建很多對(duì)象,會(huì)產(chǎn)生大量的重復(fù)代碼。比如我想再創(chuàng)建一個(gè)per1對(duì)象,我就得把上面的代碼再重新寫一遍,改變不同的屬性值。

**2、工廠模式**
工廠模式抽象了創(chuàng)建具體對(duì)象的過(guò)程。由于在ECMAScript中無(wú)法創(chuàng)建類,開(kāi)發(fā)人員就發(fā)明了一種函數(shù),用函數(shù)來(lái)封裝以特定接口創(chuàng)建對(duì)象的細(xì)節(jié),如下面的例子:

function createPerson(name,age,job){ var o = new Object(); o.name = name; o.age = age; o.job = job; o.sayName = function(){ alert(this.name); } return o; } var person1 = createPerson('zhang',30,'java'); var person2 = createPerson('zhao',25,'php'); //前端全棧學(xué)習(xí)交流圈:866109386 //面向1-3經(jīng)驗(yàn)?zāi)昵岸碎_(kāi)發(fā)人員 //幫助突破技術(shù)瓶頸,提升思維能力

函數(shù)createPerson()能夠根據(jù)接受到的參數(shù)來(lái)構(gòu)建一個(gè)包含所有必要信息的Person對(duì)象。可以無(wú)數(shù)次的調(diào)用這個(gè)函數(shù),而每次它都會(huì)返回一個(gè)包含三個(gè)屬性和一個(gè)方法的對(duì)象。

缺點(diǎn):工廠模式雖然解決了創(chuàng)建多個(gè)相似對(duì)象的問(wèn)題,但卻沒(méi)有解決對(duì)象識(shí)別的問(wèn)題(即怎樣知道一個(gè)對(duì)象的類型)。

**3、構(gòu)造函數(shù)模式**
可以使用構(gòu)造函數(shù)模式將前面的例子重寫如下:

function Person(name,age,job){ this.name= name; this.age = age; this.job = job; this.sayName = function(){ alert(this.name); } } var person1 = new Person('zhang',30,'java'); var person2 = new Person('zhao',25,'php'); //前端全棧學(xué)習(xí)交流圈:866109386 //面向1-3經(jīng)驗(yàn)?zāi)昵岸碎_(kāi)發(fā)人員 //幫助突破技術(shù)瓶頸,提升思維能力

創(chuàng)建自定義的構(gòu)造函數(shù)意味著將來(lái)可以將它的實(shí)例標(biāo)識(shí)為一種特定的類型。而這正是構(gòu)造函數(shù)模式勝過(guò)工廠模式的地方。

然而,使用構(gòu)造函數(shù)的主要問(wèn)題,就是每個(gè)方法都要在每個(gè)實(shí)例上重新創(chuàng)建一遍。在上面的例子中,person1和person2都有一個(gè)名為sayName()的方法,但那兩個(gè)方法不是同一個(gè)Function的實(shí)例,創(chuàng)建兩個(gè)完成同樣任務(wù)的Function實(shí)例的確沒(méi)有必要;況且有this對(duì)象在,根本不用在執(zhí)行代碼前就把函數(shù)綁定到特定對(duì)象上面。因此可以像下面這樣,通過(guò)把函數(shù)定義轉(zhuǎn)移到構(gòu)造函數(shù)外部來(lái)解決這個(gè)問(wèn)題。

function Person(name,age,job){ this.name= name; this.age = age; this.job = job; this.sayName = sayName(); } function sayName(){ alert(this.name); } var person1 = createPerson('zhang',30,'java'); var person2 = createPerson('zhao',25,'php');

在這個(gè)例子中,我們把sayName()函數(shù)的定義轉(zhuǎn)移到構(gòu)造函數(shù)外部。而在構(gòu)造函數(shù)內(nèi)部,我們將sayName屬性設(shè)置成等于全局的sayName函數(shù),這樣person1和person2對(duì)象就共享了在全局作用域中定義的同一個(gè)sayName()函數(shù)。這樣確實(shí)解決了兩個(gè)函數(shù)在做同一件事的問(wèn)題,可是新問(wèn)題又來(lái)了:在全局作用域中定義的函數(shù)實(shí)際上只能被某個(gè)對(duì)象調(diào)用,這讓全局作用域有點(diǎn)名不副實(shí)。更讓人無(wú)法接受的是:如果對(duì)象需要定義很多方法,那么就要定義很多全局函數(shù)。好在,這些問(wèn)題可以通過(guò)使用原型模式來(lái)解決。

**4、原型模式**
我們創(chuàng)建的每個(gè)函數(shù)都有一個(gè)prototype(原型)屬性,這個(gè)屬性是一個(gè)指針,指向一個(gè)對(duì)象,而這個(gè)對(duì)象的用途是包含可以由特定類型的所有實(shí)例共享的屬性和方法。使用原型對(duì)象的好處是可以讓所有的對(duì)象實(shí)例共享他所包含的屬性和方法。

function Person(){} Person.prototype.name = 'zhang'; Person.prototype.age = '22'; Person.prototype.job = 'html5'; Person.prototype.sayName = function(){ alert(this.name); }; var person1 = new Person(); var person2 = new Person();

原型模式也不是沒(méi)有缺點(diǎn)。首先,它省略了為構(gòu)造函數(shù)傳遞初始化參數(shù)這一環(huán)節(jié),結(jié)果所有實(shí)例在默認(rèn)情況下都將取得相同的屬性值。雖然這會(huì)在某種程度上帶來(lái)一些不方便,但還不是原型的最大問(wèn)題。原型模式的最大問(wèn)題是由共享的本性所導(dǎo)致的。

原型中所有屬性是被很多實(shí)例共享的,這種共享對(duì)于函數(shù)非常合適。對(duì)于那些包含基本值的屬性倒也說(shuō)的過(guò)去,通過(guò)在實(shí)例上添加一個(gè)同名屬性,可以隱藏原型中的對(duì)應(yīng)屬性。然后,對(duì)于包含引用類型的屬性來(lái)說(shuō),問(wèn)題就比較突出了。

function Person(){} Person.prototype = { constructor:Person, name:'zhang', age :'22', job :'html5', friends:\['wang','li'\], sayName : function(){ alert(this.name); } }; var person1 = new Person(); var person2 = new Person(); person1.friends.push('zhao'); alert(person1.friends); //'wang,li,zhao' alert(person2.friends); //'wang,li,zhao' alert(person1.friends === person2.friends); //true

從上面的打印的結(jié)果我們就可以知道為什么很少人單獨(dú)使用原型模式了,實(shí)例一般都是要有屬于自己的全部屬性的。

**5、組合使用構(gòu)造函數(shù)模式和原型模式**
組合使用構(gòu)造函數(shù)模式和原型模式,是創(chuàng)建自定義類型的最常見(jiàn)方式。構(gòu)造函數(shù)模式用于定義實(shí)例屬性,而原型模式用于定義方法和共享的屬性。結(jié)果,每個(gè)實(shí)例都會(huì)有自己的一份實(shí)例屬性的副本,但同時(shí)又共享著對(duì)方法的引用,最大限度的節(jié)省了內(nèi)存。

function Person(name,age,job){ this.name= name; this.age = age; this.job = job; this.friends = \['wang','li'\]; } Person.prototype = { constructor:Person, sayName : function(){ alert(this.name); } } var person1 = new Person('zhang',26,'java',); var person2 = new Person('sun',25,'php'); person1.friends.push('zhao'); alert(person1.friends); //'wang,li,zhao' alert(person2.friends); //'wang,li' alert(person1.friends === person2.friends); //false

在上面的例子中,實(shí)例屬性都是在構(gòu)造函數(shù)中定義的,而由所有實(shí)例共享的屬性constructor和方法satName()則是在原型中定義的。而修改了person1.friends(向其中添加一個(gè)新字符串),并不會(huì)影響到person2.friends,因?yàn)樗麄兎謩e引用了不同的數(shù)組。

轉(zhuǎn)載于:https://my.oschina.net/u/3970421/blog/2939981

總結(jié)

以上是生活随笔為你收集整理的JavaScript实现创建自定义对象的常用方式总结的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 婷婷激情电影 | 成年激情网 | 日本中文字幕在线视频 | 久艹在线 | hd性videos意大利精品 | 高清av一区二区三区 | 日韩欧美在线观看免费 | 又黄又高潮的视频 | 在线色站 | av网址在线 | 蜜臀久久99精品久久久久久 | 色屁屁一区二区 | 国产视频二 | 天天干一干 | 91精品亚洲一区 | 成年人视频在线播放 | 亚洲天堂精品在线观看 | 天天尻 | 欧美极品第一页 | 久久成人a毛片免费观看网站 | 好看的中文字幕电影 | 污片在线免费看 | 午夜影院在线观看 | 国精产品一区一区三区视频 | 欧美黄色a级片 | 欧美成人看片黄a免费看 | 久草麻豆 | 天堂成人在线观看 | 欧美少妇色图 | 国产91av视频 | 亚洲乱妇老熟女爽到高潮的片 | 久久久中文 | 国产精品久久久精品 | 成人乱码一区二区三区av | 亚洲乱码视频 | 亚洲综合免费视频 | 亚洲中文一区二区三区 | 久热免费在线视频 | 鲁丝一区二区 | 欧美性猛交性大交 | 一区二区视频免费在线观看 | 亚洲欧洲在线视频 | 人妖av在线 | 欧美视频在线看 | 2023天天操 | 成年人免费视频网站 | 一级片免费播放 | 高清欧美性猛交xxxx黑人猛交 | 99在线精品视频 | 色偷偷人人澡人人爽人人模 | 少妇一级淫免费放 | 91成人福利在线 | 国精品人妻无码一区二区三区喝尿 | 在线免费看毛片 | 毛片一级片 | 4438成人网 | 美女伊人网 | 99自拍网 | 国产欧美日韩综合精品一区二区 | 美女被揉胸视频 | 多男调教一女折磨高潮高h 国内毛片毛片毛片毛片毛片 | 婷婷久久五月 | www四虎精品视频免费网站 | 污视频网站在线 | 九色视频网| 超碰97在线播放 | 91精品国产乱码久久久久久久久 | www在线视频 | 亚洲涩情 | 国产91在线观看 | 日韩欧美国产一区二区三区在线观看 | 欧美性猛交bbbbb精品 | 欧美在线性爱视频 | 亚洲高清一区二区三区 | 伊人成长网 | 精品国产18久久久久久二百 | 亚洲av成人片无码 | 久久午夜av | 被两个男人吃奶三p爽文 | 超碰天天操 | 久热精品视频在线观看 | 色优久久 | 色射视频| 久久久久久久久久久99 | 国产免费麻豆 | 手机av免费观看 | 另类小说久久 | 久久午夜神器 | k8经典成人理伦片 | 国产一区二区三区精品在线 | 91亚洲精品一区二区乱码 | 成人精品区 | 欧美人与禽zozzozzo | 日韩欧美大片在线观看 | 91超碰免费在线 | 日韩欧美91 | 自拍偷拍99 | 在线免费观看污片 | 五月综合色婷婷 |