摘要:本文在我博客上的地址問(wèn)題那天朋友分享了一個(gè)面試題,自己當(dāng)時(shí)不會(huì),代碼如下很簡(jiǎn)單,的結(jié)果是。那么問(wèn)題就來(lái)了,你需要傳遞一個(gè),返回。
本文在我博客上的地址: http://lpgray.me/article/46/
問(wèn)題那天朋友分享了一個(gè)面試題,自己當(dāng)時(shí)不會(huì),代碼如下:
(function(){ var u = { a: 1, b: 2 }; var r = { m: function(k){ return u[k]; } } window.r = r; })() var R = window.r; alert(r.m("a"))
很簡(jiǎn)單,alert的結(jié)果是1。
但是題目卻是另外一個(gè)說(shuō)法,能不能通過(guò)r.m獲取到u?
當(dāng)時(shí)聽(tīng)到這個(gè)問(wèn)題也凌亂了,壓根就不知道啥意思,通過(guò)r.m獲取到u?
實(shí)際上這個(gè)問(wèn)題問(wèn)的重點(diǎn)是當(dāng)u不知道的時(shí)候,如何通過(guò)u[attribute]這種方式來(lái)獲得u的自身。那么問(wèn)題就來(lái)了,你需要傳遞一個(gè)attribute,r.m(attribute) 返回 u。
解決方案有一個(gè)非標(biāo)準(zhǔn)的,而且將被廢棄的方法 Object.prototype.__defineGetter__ 可以給對(duì)象指定一個(gè)參數(shù)并且綁定一個(gè)函數(shù),當(dāng)未來(lái)你在此對(duì)象的實(shí)例上調(diào)用此參數(shù)時(shí),綁定的函數(shù)會(huì)被調(diào)用,該參數(shù)是被定義在 prototype 上,所以此參數(shù)就是一個(gè)實(shí)例屬性,那個(gè)函數(shù)被調(diào)用時(shí),是以當(dāng)前實(shí)例為上下文。
哦?那這樣的話u就是一個(gè)實(shí)例,給u綁定一個(gè)參數(shù),當(dāng)此參數(shù)調(diào)用的時(shí)候返回u自身不就好啦?
怎么綁定呢?u是一個(gè)Object的實(shí)例,它繼承自O(shè)bject,那么就給 Object.prototype 定義一個(gè)屬性,使得該屬性訪問(wèn)時(shí)調(diào)用的函數(shù)返回 this 就可以了,所以,解決方案如下:
Object.prototype.__defineGetter__("uuu", function(){ return this; }); alert(R.m("uuu"));
此題這樣就算解決了,此題的精髓主要是三點(diǎn):
你能否想到通過(guò)屬性訪問(wèn)自身
你能否想到使用原型繼承來(lái)定義訪問(wèn)自身的屬性
你是否知道 Object.prototype.__defineGetter__
優(yōu)化解決方案為了不污染 Object 原型鏈,我們應(yīng)該定義一個(gè)隨機(jī)的參數(shù)來(lái)返回自身,當(dāng)使用之后再刪除之,那么比較完美的方案應(yīng)該是:
Object.prototype.__defineGetter__("x123c3", function(){ return this; }); alert(R.m("x123c3")); delete Object.prototype["x123c3"]既然廢棄了,有沒(méi)有替代方法?
嗯,本來(lái)自己不太清楚,感謝網(wǎng)友的幫忙。
目前存在這么一個(gè)API:Object.defineProperty(obj, "key", { // descriptor }); 參閱API
使得可以直接在某一對(duì)象上定義一個(gè)屬性,這個(gè)屬性可以是添加或修改現(xiàn)有的屬性,前兩個(gè)參數(shù)都很好理解,obj就是要修改的對(duì)象,key就是屬性名,descriptor是一個(gè)對(duì)象,用來(lái)聲明新添屬性的一些特性,包括6個(gè)參數(shù):
configurable:默認(rèn)false,表示此屬性是否可用delete刪除
enumerable: 默認(rèn)為false,表示此屬性是否可被for...in、Object.keys遍歷到
value:默認(rèn)undefined,此屬性的值,可以是任何JavaScript類(lèi)型
writable:默認(rèn)為false,此屬性是否可被改寫(xiě)
get:默認(rèn)undefined,指定一個(gè)函數(shù),當(dāng)屬性被調(diào)用時(shí),此函數(shù)也被調(diào)用,默認(rèn)為返回屬性值
set:默認(rèn)undefined,指定一個(gè)函數(shù),當(dāng)屬性被賦值時(shí),此函數(shù)也被調(diào)用,僅接受一個(gè)參數(shù),參數(shù)為屬性被賦的值
那么上面的解決方案可以改為:
Object.defineProperty(Object.prototype, "blablabla", { get : function(){ return this; } }); console.log(R.m("blablabla"));
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/85426.html
摘要:創(chuàng)建對(duì)象使用或者對(duì)象字面量都可以創(chuàng)建對(duì)象,但是這樣創(chuàng)建的對(duì)象過(guò)于簡(jiǎn)單,不易于對(duì)象的屬性與方法的擴(kuò)展與繼承。下面講的對(duì)象可以與中的做類(lèi)比。通過(guò)調(diào)用構(gòu)造函數(shù)創(chuàng)建的那個(gè)對(duì)象實(shí)例的原型對(duì)象。 創(chuàng)建對(duì)象 使用new Object()或者對(duì)象字面量都可以創(chuàng)建對(duì)象,但是這樣創(chuàng)建的對(duì)象過(guò)于簡(jiǎn)單,不易于對(duì)象的屬性與方法的擴(kuò)展與繼承。 下面講的對(duì)象可以與JavaEE中的bean做類(lèi)比。 工廠模式 對(duì),首...
摘要:對(duì)象拷貝可遍歷屬性淺拷貝簡(jiǎn)單的淺拷貝可以用,對(duì)存取器定義的對(duì)象也試用深拷貝屬性描述對(duì)象的拷貝這是個(gè)淺拷貝深拷貝不可遍歷屬性對(duì)象的拷貝例如拷貝獲得共同的原型,與是兄弟關(guān)系說(shuō)明也繼承了原型,同級(jí)別簡(jiǎn)潔化版 對(duì)象拷貝 可遍歷屬性 淺拷貝 if(typeof Object.prototype.copy != function) { Object.prototype.copy = fun...
摘要:中有基本類(lèi)型和復(fù)雜類(lèi)型的區(qū)分。原型與原型鏈這里,就引入了兩個(gè)新的概念。原型對(duì)象就是用來(lái)存放聲明對(duì)象中共有的那部分屬性。而原型對(duì)象自身也是一個(gè)對(duì)象,它也有自己的原型對(duì)象。這樣層層上溯,就形成了一個(gè)類(lèi)似鏈表的結(jié)構(gòu),這就是原型鏈。 JavaScript中有基本類(lèi)型和復(fù)雜類(lèi)型的區(qū)分。 當(dāng)我們?cè)诼暶饕粋€(gè)基本類(lèi)型時(shí): var n1= 1; console.log(n1); //1 這時(shí)我們可以用N...
摘要:想必面試題刷的多的同學(xué)對(duì)下面這道題目不陌生,能夠立即回答出輸出個(gè),可是你真的懂為什么嗎為什么是輸出為什么是輸出個(gè)這兩個(gè)問(wèn)題在我腦邊縈繞。同步任務(wù)都好理解,一個(gè)執(zhí)行完執(zhí)行下一個(gè)。本文只是我對(duì)這道面試題的一點(diǎn)思考,有誤的地方望批評(píng)指正。 想必面試題刷的多的同學(xué)對(duì)下面這道題目不陌生,能夠立即回答出輸出10個(gè)10,可是你真的懂為什么嗎?為什么是輸出10?為什么是輸出10個(gè)10?這兩個(gè)問(wèn)題在我腦...
摘要:注很多以前的源碼分析文章中,所寫(xiě)的第一個(gè)執(zhí)行的文件代碼為,但這個(gè)文件在中已被移除,并被拆解為了等其他下的文件,為正文作為第一段被執(zhí)行的代碼,它的歷史使命免不了就是進(jìn)行一些環(huán)境和全局變量的初始化工作。 大家可能會(huì)好奇,在 Node.js 啟動(dòng)后,第一個(gè)執(zhí)行的 JavaScript 文件會(huì)是哪個(gè)?它具體又會(huì)干些什么事? 一步步來(lái)看,翻開(kāi) Node.js 的源碼,不難看出,入口文件在 src...
閱讀 2815·2023-04-25 23:08
閱讀 1606·2021-11-23 09:51
閱讀 1587·2021-10-27 14:18
閱讀 3130·2019-08-29 13:25
閱讀 2845·2019-08-29 13:14
閱讀 2925·2019-08-26 18:36
閱讀 2205·2019-08-26 12:11
閱讀 826·2019-08-26 11:29