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

資訊專欄INFORMATION COLUMN

一個你可能沒有注意到的關(guān)于JavaScript屬性設(shè)置的知識

lovXin / 2730人閱讀

摘要:今天看你不知道的第五章原型的時候,注意到一個關(guān)于屬性設(shè)置的有意思的地方。但沒想到,還有其他不能添加新屬性的情況。原型鏈上有同名的存取器屬性,且至少設(shè)置了。規(guī)則這里以設(shè)置為例。那么當(dāng)我們遇到關(guān)于這些知識的的時候,就會很快將問題解決了。

今天看《你不知道的JavaScript》第五章——原型的時候,注意到一個關(guān)于JavaScript屬性設(shè)置的有意思的地方。(P145

之前,我以為除了對象被設(shè)置為不可擴(kuò)展的情況,其他情況下給對象添加新屬性都會成功。但沒想到,還有其他不能添加新屬性的情況。我所說的這種情況,就是原型鏈上有與你將要添加的屬性同名的屬性的時候。

分類

原型鏈上有與你將要添加的屬性同名的屬性的情況,還要分成三種情況:

原型鏈上有同名的數(shù)據(jù)屬性并且沒有被標(biāo)記為只讀,即writable: true

原型鏈上有同名的數(shù)據(jù)屬性,但它被標(biāo)記為只讀,即writable: false。

原型鏈上有同名的存取器屬性,且至少設(shè)置了setter。

規(guī)則

這里以設(shè)置myObject.foo = "my"為例。

同名數(shù)據(jù)屬性、可讀

如果在[[Prototype]]鏈上層存在名為foo的普通數(shù)據(jù)訪問屬性并且沒有被標(biāo)記為只讀(wirtable: false),那么就會在myObject中添加一個名為foo的新屬性,它就是屏蔽屬性。

這種情況是最常見的,下面貼一個簡單的例子。

var proObject = {
    foo: "pro"
}
var myObject = Object.create(proObject)
myObject.foo = "my"
myObject.foo                      // "my"
myObject.hasOwnProperty("foo")    // true
同名數(shù)據(jù)屬性、只讀

如果在[[Prototype]]鏈上層存在foo,但是它被標(biāo)記為只讀(writable: false),那么無法修改已有屬性或者在myObject上創(chuàng)建屏蔽屬性。如果運(yùn)行在嚴(yán)格模式下,代碼會拋出一個錯誤。否則,這條賦值語句會被忽略。

var proObject = {}
Object.defineProperty(proObject, "foo", {
    value: "pro",
    wirtable: false
})
var myObject = Object.create(proObject)
myObject.foo = "my"
myObject.foo                      // "pro"
myObject.hasOwnProperty("foo")    // false

"use strict"
myObject.foo = "my"    // Uncaught TypeError: Cannot assign to read only property "foo" of object "#"
同名的存取器屬性

如果在[[Prototype]]鏈上層存在foo并且它是一個setter,那就一定會調(diào)用這個setter。foo不會被添加到(或者說屏蔽于)myObject,也不會重新定義foo這個setter。

var proObject = {}
Object.defineProperty(proObject, "foo", {
    set: function(val) {
        this.s = val
    },
    get: function() {
        return this.s
    }
})
myObject.foo = "my"
myObject.hasOwnProperty("foo")    // false

// 可以看到存取器屬性沒有被重新定義
Object.getOwnPropertyDescriptor(proObject, "foo") 
解決方案

如果你希望在上述的第二和第三中情況下為myObject添加新屬性的話,你需要使用Object.defineProperty或者Object.getOwnPropertyDescriptors來添加新屬性。

結(jié)語

終于在周日完成了這周的博客文章了(雖然很無恥地“水了一篇”,但好歹也算一篇文章嘛。)

正經(jīng)一點?。?!JavaScript中還有很多讓我們出乎意料的地方,雖然平時很少遇到這些方面知識的應(yīng)用,但一旦踩了這些坑,還是會耗掉我們挺多時間和精力的。所以,我們平時應(yīng)該多留意這些知識,并積累下來。那么當(dāng)我們遇到關(guān)于這些知識的bug的時候,就會很快將問題解決了。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/88015.html

相關(guān)文章

  • 前端知識點整理

    摘要:難怪超過三分之一的開發(fā)人員工作需要一些知識。但是隨著行業(yè)的飽和,初中級前端就業(yè)形勢不容樂觀。整個系列的文章大概有篇左右,從我是如何成為一個前端工程師,到各種前端框架的知識。 為什么 call 比 apply 快? 這是一個非常有意思的問題。 作者會在參數(shù)為3個(包含3)以內(nèi)時,優(yōu)先使用 call 方法進(jìn)行事件的處理。而當(dāng)參數(shù)過多(多余3個)時,才考慮使用 apply 方法。 這個的原因...

    Lowky 評論0 收藏0
  • 前端知識點整理

    摘要:難怪超過三分之一的開發(fā)人員工作需要一些知識。但是隨著行業(yè)的飽和,初中級前端就業(yè)形勢不容樂觀。整個系列的文章大概有篇左右,從我是如何成為一個前端工程師,到各種前端框架的知識。 為什么 call 比 apply 快? 這是一個非常有意思的問題。 作者會在參數(shù)為3個(包含3)以內(nèi)時,優(yōu)先使用 call 方法進(jìn)行事件的處理。而當(dāng)參數(shù)過多(多余3個)時,才考慮使用 apply 方法。 這個的原因...

    snowLu 評論0 收藏0
  • 【譯】前端練級攻略

    摘要:由于系統(tǒng)變得越來越復(fù)雜,人們提出了稱為預(yù)處理器和后處理器的工具來管理復(fù)雜性。后處理器在由預(yù)處理器手寫或編譯后對應(yīng)用更改。我之前建議的文章,,也涵蓋了預(yù)處理器相關(guān)的知識。 譯者:前端小智 原文:medium.freecodecamp.org/from-zero-t… medium.freecodecamp.org/from-zero-t… 我記得我剛開始學(xué)習(xí)前端開發(fā)的時候。我看到了很多文章及...

    wuyumin 評論0 收藏0
  • 十分鐘快速了解《不知道 JavaScript》(上卷)

    摘要:最近剛剛看完了你不知道的上卷,對有了更進(jìn)一步的了解。你不知道的上卷由兩部分組成,第一部分是作用域和閉包,第二部分是和對象原型。附錄詞法這一章并沒有說明機(jī)制,只是介紹了中的箭頭函數(shù)引入的行為詞法。第章混合對象類類理論類的機(jī)制類的繼承混入。 最近剛剛看完了《你不知道的 JavaScript》上卷,對 JavaScript 有了更進(jìn)一步的了解。 《你不知道的 JavaScript》上卷由兩部...

    趙春朋 評論0 收藏0
  • 前端基礎(chǔ)進(jìn)階(十一):詳細(xì)圖解jQuery對象,以及如何擴(kuò)展jQuery插件

    摘要:而在構(gòu)造函數(shù)中,返回了的實例對象。在中直接返回過的實例,這里的是的真正構(gòu)造函數(shù)最后對外暴露入口時,將字符與對等起來。因此當(dāng)我們直接使用創(chuàng)建一個對象時,實際上是創(chuàng)建了一個的實例,這里的正真構(gòu)造函數(shù)是原型中的方法。 showImg(https://segmentfault.com/img/remote/1460000008749398); 早幾年學(xué)習(xí)前端,大家都非常熱衷于研究jQuery源...

    RebeccaZhong 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<