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