成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專(zhuān)欄INFORMATION COLUMN

__defineGetter__ 引發(fā)的思考

Charles / 3095人閱讀

摘要:本文在我博客上的地址問(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

相關(guān)文章

  • JS-創(chuàng)建對(duì)象

    摘要:創(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ì),首...

    william 評(píng)論0 收藏0
  • JavaScript學(xué)習(xí)之對(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...

    Aklman 評(píng)論0 收藏0
  • 淺談:快速理解JS原型與原型鏈

    摘要:中有基本類(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...

    ZoomQuiet 評(píng)論0 收藏0
  • 一道面試題引發(fā)思考 --- Event Loop

    摘要:想必面試題刷的多的同學(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)題在我腦...

    betacat 評(píng)論0 收藏0
  • 通過(guò)源碼解析 Node.js 啟動(dòng)時(shí)第一個(gè)執(zhí)行 js 文件:bootstrap_node.js

    摘要:注很多以前的源碼分析文章中,所寫(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...

    TNFE 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<