电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術(shù)文章
文章詳情頁

JavaScript 創(chuàng)建對(duì)象: 方法一覽與最佳實(shí)踐

瀏覽:42日期:2023-11-18 08:32:44

在JavaScript中“創(chuàng)建對(duì)象”是一個(gè)復(fù)雜的話題。這門語言提供了很多種創(chuàng)建對(duì)象的方式,不論新手還是老手都可能對(duì)此感到無所適從,不知道應(yīng)該選擇哪一種。不過,盡管創(chuàng)建對(duì)象的方法很多,看上去語法差異也很大,但實(shí)際上它們的相似性可能比你所以為的要多。本文將帶領(lǐng)你踏上一段梳理對(duì)象創(chuàng)建方法的旅程,為你揭示不同方法之間的依賴與遞進(jìn)關(guān)系。

JavaScript 創(chuàng)建對(duì)象: 方法一覽與最佳實(shí)踐

 對(duì)象字面量

我們的第一站毫無疑問就是創(chuàng)建對(duì)象最簡(jiǎn)單的方法,對(duì)象字面量。JavaScript總是宣揚(yáng)自己能夠“無中生有”地創(chuàng)建對(duì)象——不需要類、不需要模板、不需要原型——“噌”地一下,一個(gè)有方法有數(shù)據(jù)的對(duì)象就出現(xiàn)了。

var o = { x: 42, y: 3.14, f: function() {}, g: function() {}};

但這種方法有一個(gè)缺點(diǎn):如果我們想在其他地方創(chuàng)建一個(gè)同類型的對(duì)象,就得把這個(gè)對(duì)象的方法、數(shù)據(jù)和初始化都復(fù)制粘貼過去。我們需要一種能夠批量創(chuàng)建同類型對(duì)象的方法,而不是只創(chuàng)建一個(gè)對(duì)象。

 工廠函數(shù)

我們的下一站是工廠函數(shù)。顯然,用這種方法來創(chuàng)建一類具有相同結(jié)構(gòu)、接口和實(shí)現(xiàn)的對(duì)象是最簡(jiǎn)單的。我們不直接創(chuàng)建一個(gè)對(duì)象字面量,而是將對(duì)象字面量作為函數(shù)的返回值,當(dāng)我們需要多次或多處創(chuàng)建同類型的對(duì)象時(shí),只要調(diào)用這個(gè)函數(shù)就行了。

function thing() { return { x: 42, y: 3.14, f: function() {}, g: function() {} };}var o = thing();

但這種方法也有一個(gè)缺點(diǎn):它會(huì)導(dǎo)致內(nèi)存膨脹,因?yàn)槊恳粋€(gè)對(duì)象都包含了工廠函數(shù)的獨(dú)立副本。理論上我們希望所有對(duì)象共享一個(gè)工廠函數(shù)副本。

 原型鏈

JavaScript提供了一種內(nèi)置的在對(duì)象之間共享數(shù)據(jù)的機(jī)制,叫做原型鏈。當(dāng)我們?cè)L問一個(gè)對(duì)象的屬性時(shí),它會(huì)委托某些其他對(duì)象來完成這一請(qǐng)求。我們可以利用這一點(diǎn)來修改工廠函數(shù),使它創(chuàng)建的每個(gè)對(duì)象只包含自己特有的數(shù)據(jù),而對(duì)其他屬性的請(qǐng)求則全部委托給原型鏈上共有的一個(gè)對(duì)象。

var thingPrototype = { f: function() {}, g: function() {}};function thing() { var o = Object.create(thingPrototype); o.x = 42; o.y = 3.14; return o;}var o = thing();

事實(shí)上,JavaScript本身就有內(nèi)置的機(jī)制來支持這種通用模式。我們不需要自己創(chuàng)建這個(gè)共有的對(duì)象(即原型對(duì)象),JavaScript會(huì)自動(dòng)為每個(gè)函數(shù)創(chuàng)建一個(gè)原型對(duì)象,我們可以把共享數(shù)據(jù)直接放在這個(gè)對(duì)象里。

thing.prototype.f = function() {};thing.prototype.g = function() {};function thing() { var o = Object.create(thing.prototype); o.x = 42; o.y = 3.14; return o;}var o = thing();

但這種方法也有一個(gè)缺點(diǎn):會(huì)導(dǎo)致重復(fù)。上述thing函數(shù)的第一行和最后一行在每一個(gè)“委托原型的工廠函數(shù)”中都會(huì)重復(fù)一次,幾乎沒有區(qū)別。

 ES5 類

我們可以把那些重復(fù)的代碼抽出來,放進(jìn)一個(gè)自定義函數(shù)里。這個(gè)函數(shù)會(huì)創(chuàng)建一個(gè)對(duì)象,并與其他某個(gè)任意函數(shù)(參數(shù)函數(shù))的原型建立委托(繼承)關(guān)系,然后我們把新創(chuàng)建的對(duì)象作為參數(shù),調(diào)用這個(gè)函數(shù)(參數(shù)函數(shù)),最后返回這個(gè)新的對(duì)象。

function create(fn) { var o = Object.create(fn.prototype); fn.call(o); return o;}// ...Thing.prototype.f = function() {};Thing.prototype.g = function() {};function Thing() { this.x = 42; this.y = 3.14;}var o = create(Thing);

事實(shí)上,JavaScript對(duì)這種方法也有內(nèi)置的支持機(jī)制。我們定義的這個(gè)create函數(shù)實(shí)際上就是new關(guān)鍵字的一個(gè)基本實(shí)現(xiàn),因此我們可以順手把create換成new。

Thing.prototype.f = function() {};Thing.prototype.g = function() {};function Thing() { this.x = 42; this.y = 3.14;}var o = new Thing();

我們現(xiàn)在抵達(dá)的這一站通常被稱為ES5類。它通過函數(shù)來創(chuàng)建對(duì)象,把需要共享的數(shù)據(jù)委托給原型對(duì)象,并使用new關(guān)鍵字來處理重復(fù)的邏輯。

但這種方法也有一個(gè)缺點(diǎn):冗長(zhǎng)又難看,而且在實(shí)現(xiàn)繼承的時(shí)候會(huì)更冗長(zhǎng)更難看。

 ES6 類

JavaScript最新的相關(guān)改進(jìn)是ES6 類,用新語法來實(shí)現(xiàn)上述功能要簡(jiǎn)潔得多。

class Thing { constructor() { this.x = 42; this.y = 3.14; } f() {} g() {}}var o = new Thing(); 比較

多年以來,JavaScript開發(fā)者們與原型鏈的關(guān)系總是若即若離,糾纏不清。而今天我們最有可能遇到的兩種創(chuàng)建對(duì)象的方式,一種是強(qiáng)烈依賴原型鏈的class語法,另一種則是完全不依賴原型鏈的工廠函數(shù)語法。這兩種方式在性能上和特點(diǎn)上是不一樣的——盡管差別不太大。

性能

今天的JavaScript引擎已經(jīng)經(jīng)過了大幅度的優(yōu)化,以至于很難通過JavaScript代碼來推斷怎樣會(huì)比較快。關(guān)鍵在于測(cè)量方法。然而測(cè)量方法有時(shí)也會(huì)失靈。通常每六周就會(huì)有更新的JavaScript引擎發(fā)布,而在這之前采取的測(cè)量方法,和基于這種測(cè)量方法做出的決策都有可能失去意義。因此,我的經(jīng)驗(yàn)法則是選擇最官方、最廣泛使用的語法,因?yàn)榇蠖鄶?shù)時(shí)候它經(jīng)歷的實(shí)踐檢驗(yàn)最多,因而性能是最高的。目前來說class語法最符合這一點(diǎn),在我寫這篇文章時(shí),class語法大約比返回字面量的工廠函數(shù)快3倍。

特點(diǎn)

隨著ES6的發(fā)布,類與工廠函數(shù)之間曾經(jīng)存在的幾點(diǎn)差異消失了。現(xiàn)在,工廠函數(shù)和類都能夠強(qiáng)制實(shí)現(xiàn)真正的私有數(shù)據(jù)——工廠函數(shù)通過閉包實(shí)現(xiàn),類通過WeakMap實(shí)現(xiàn)。兩者都能實(shí)現(xiàn)多重繼承——工廠函數(shù)可以將其他屬性混入自己的對(duì)象,類也可以將其他屬性混入自己的原型,或者通過類工廠,通過代理也能實(shí)現(xiàn)。工廠函數(shù)和類也都可以在需要的時(shí)候返回任意對(duì)象,語法也都很簡(jiǎn)單。

 結(jié)論

綜合考慮,我更傾向于class語法。它標(biāo)準(zhǔn)、簡(jiǎn)單、干凈、快速,還提供了所有曾經(jīng)只有函數(shù)工廠才具備的特點(diǎn)。

英文原文:https://www.sitepoint.com/javascript-object-creation-patterns-best-practises/

標(biāo)簽: JavaScript
相關(guān)文章:
主站蜘蛛池模板: 吲哚菁绿衍生物-酶底物法大肠菌群检测试剂-北京和信同通科技发展有限公司 | 汝成内控-行政事业单位内部控制管理服务商 | 成都租车_成都租车公司_成都租车网_众行宝 | 二手Sciex液质联用仪-岛津气质联用仪-二手安捷伦气质联用仪-上海隐智科学仪器有限公司 | 百度爱采购运营研究社社群-店铺托管-爱采购代运营-良言多米网络公司 | 青岛代理记账_青岛李沧代理记账公司_青岛崂山代理记账一个月多少钱_青岛德辉财税事务所官网 | 塑木弯曲试验机_铜带拉伸强度试验机_拉压力测试台-倾技百科 | 吉祥新世纪铝塑板_生产铝塑板厂家_铝塑板生产厂家_临沂市兴达铝塑装饰材料有限公司 | 根系分析仪,大米外观品质检测仪,考种仪,藻类鉴定计数仪,叶面积仪,菌落计数仪,抑菌圈测量仪,抗生素效价测定仪,植物表型仪,冠层分析仪-杭州万深检测仪器网 | 珠宝展柜-玻璃精品展柜-首饰珠宝展示柜定制-鸿钛展柜厂家 | 品牌设计_VI设计_电影海报设计_包装设计_LOGO设计-Bacross新越品牌顾问 | 衢州装饰公司|装潢公司|办公楼装修|排屋装修|别墅装修-衢州佳盛装饰 | 传动滚筒,改向滚筒-淄博建凯机械科技有限公司 | 德州网站制作 - 网站建设设计 - seo排名优化 -「两山建站」 | 四川成人高考_四川成考报名网| 热镀锌槽钢|角钢|工字钢|圆钢|H型钢|扁钢|花纹板-天津千百顺钢铁贸易有限公司 | 安徽合肥格力空调专卖店_格力中央空调_格力空调总经销公司代理-皖格制冷设备 | 偏心半球阀-电动偏心半球阀-调流调压阀-旋球阀-上欧阀门有限公司 | 东莞市踏板石餐饮管理有限公司_正宗桂林米粉_正宗桂林米粉加盟_桂林米粉加盟费-东莞市棒子桂林米粉 | 济南电缆桥架|山东桥架-济南航丰实业有限公司 | 空压机商城|空气压缩机|空压机配件-压缩机网旗下商城 | 上海软件开发-上海软件公司-软件外包-企业软件定制开发公司-咏熠科技 | 水平垂直燃烧试验仪-灼热丝试验仪-漏电起痕试验仪-针焰试验仪-塑料材料燃烧检测设备-IP防水试验机 | 章丘丰源机械有限公司 - 三叶罗茨风机,罗茨鼓风机,罗茨风机 | 便携式高压氧舱-微压氧舱-核生化洗消系统-公众洗消站-洗消帐篷-北京利盟救援 | 3d打印服务,3d打印汽车,三维扫描,硅胶复模,手板,快速模具,深圳市精速三维打印科技有限公司 | 江西自考网-江西自学考试网| 拉力测试机|材料拉伸试验机|电子拉力机价格|万能试验机厂家|苏州皖仪实验仪器有限公司 | 杭州荣奥家具有限公司-浙江办公家具,杭州办公家具厂 | 瓶盖扭矩仪(扭力值检测)-百科 | 便携式谷丙转氨酶检测仪|华图生物科技百科| 珠海网站建设_响应网站建设_珠海建站公司_珠海网站设计与制作_珠海网讯互联 | 打孔器,打孔钳厂家【温州新星德牌五金工具】 | 冷轧机|两肋冷轧机|扁钢冷轧机|倒立式拉丝机|钢筋拔丝机|收线机-巩义市华瑞重工机械制造有限公司 | 英语词典_成语词典_日语词典_法语词典_在线词典网 | 苏州同创电子有限公司 - 四探针测试仪源头厂家 | 成都亚克力制品,PVC板,双色板雕刻加工,亚克力门牌,亚克力标牌,水晶字雕刻制作-零贰捌广告 | 重庆磨床过滤机,重庆纸带过滤机,机床伸缩钣金,重庆机床钣金护罩-重庆达鸿兴精密机械制造有限公司 | 安徽免检低氮锅炉_合肥燃油锅炉_安徽蒸汽发生器_合肥燃气锅炉-合肥扬诺锅炉有限公司 | ★店家乐|服装销售管理软件|服装店收银系统|内衣店鞋店进销存软件|连锁店管理软件|收银软件手机版|会员管理系统-手机版,云版,App | 二手光谱仪维修-德国OBLF光谱仪|进口斯派克光谱仪-热电ARL光谱仪-意大利GNR光谱仪-永晖检测 |