摘要:循環(huán)會(huì)遍歷所有可枚舉屬性,加上方法,可以忽略掉繼承屬性,這樣就能確保遍歷的是的可枚舉的自身屬性。如果另一個(gè)不知情的人使用了,并想通過判斷是否含有某個(gè)屬性時(shí)就會(huì)永遠(yuǎn)返回,這顯然是有問題的。這時(shí)候可以借助于或來判斷對(duì)象是否含有某個(gè)非繼承屬性。
hasOwnProperty() 方法會(huì)返回一個(gè)布爾值,這個(gè)方法可以用來檢測(cè)一個(gè)對(duì)象是否含有特定的自身(非繼承)屬性。1、for...in循環(huán)時(shí)為什么要在里面加上if(obj.hasOwnProperty(name))的判斷
這段代碼的意思是:判斷一個(gè)對(duì)象里是否含有某個(gè)非繼承屬性。
for...in 循環(huán)會(huì)遍歷所有可枚舉屬性,加上hasOwnProperty()方法,可以忽略掉繼承屬性,這樣就能確保遍歷的是Obj的可枚舉的自身屬性。
適用于:含有繼承屬性的對(duì)象,也就是除了Object的所有對(duì)象
看下面的例子:
function foo() { this.name = "foo" this.sayHi = function () { console.log("Say Hi") } } foo.prototype.sayGoodBy = function () { console.log("Say Good By") } let myPro = new foo() console.log(myPro.name) // foo console.log(myPro.hasOwnProperty("name")) // true console.log(myPro.hasOwnProperty("toString")) // false console.log(myPro.hasOwnProperty("hasOwnProperty")) // fasle console.log(myPro.hasOwnProperty("sayHi")) // true console.log(myPro.hasOwnProperty("sayGoodBy")) // false console.log("sayGoodBy" in myPro) // true2、為什么有的地方用Object.prototype.hasOwnProperty.call(obj,name)
Javascript 并沒有保護(hù) hasOwnProperty 為關(guān)鍵字或保留字。因此,會(huì)有這樣一種情況:對(duì)象自己改寫了hasOwnProperty方法,比如下面代碼中該方法永遠(yuǎn)返回false。如果另一個(gè)不知情的人使用了foo,并想通過foo.hasOwnProperty判斷foo是否含有某個(gè)屬性時(shí)就會(huì)永遠(yuǎn)返回false,這顯然是有問題的。
這時(shí)候可以借助于Object.prototype.hasOwnProperty或{}.hasOwnProperty來判斷對(duì)象是否含有某個(gè)非繼承屬性。
適用于:不確定Object類型變量是否改寫了hasOwnProperty的情況
var foo = { hasOwnProperty: function() { return false; }, bar: "Here be dragons" }; foo.hasOwnProperty("bar"); // 總是返回 false // 使用另一個(gè) hasOwnProperty 并將 this 設(shè)置為 foo 來調(diào)用它 {}.hasOwnProperty.call(foo, "bar"); // true3、總結(jié)
建議增加 hasOwnProperty 進(jìn)行判斷,可以有效避免擴(kuò)展本地原型而引起的錯(cuò)誤
如果對(duì)一個(gè)Object類型的內(nèi)部屬性不是很確定,可以通過{}.hasOwnProperty.call(obj,name)或Object.prototype.hasOwnProperty.call(obj,name)的方式判斷
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/100872.html
摘要:基本概念方法會(huì)返回一個(gè)布爾值,指示對(duì)象自身屬性中非繼承屬性是否具有指定的屬性,如果具有帶指定名稱的屬性,則方法返回,否則返回。此方法不會(huì)檢查對(duì)象原型鏈中的屬性該屬性必須是對(duì)象本身的一個(gè)成員。使用語法參數(shù),必需。 hasOwnProperty基本概念 hasOwnProperty() 方法會(huì)返回一個(gè)布爾值,指示對(duì)象自身屬性中(非繼承屬性)是否具有指定的屬性,如果 object 具有帶指定...
摘要:方法是中唯一一個(gè)處理對(duì)象屬性而不會(huì)往上遍歷原型鏈的。在這里,只有能給出正確答案,這在遍歷一個(gè)對(duì)象的屬性時(shí)是非常必要的。這里還要提醒下,當(dāng)我們使用來遍歷對(duì)象時(shí),使用將會(huì)很好地避免來自原型對(duì)象擴(kuò)展所帶來的困擾。 判斷一個(gè)屬性是定義在對(duì)象本身而不是繼承自原型鏈,我們需要使用從 Object.prototype 繼承而來的 hasOwnProperty 方法。hasOwnProperty 方法...
摘要:除此之外,原型是共享的,如果我們有的寫法,改變這兩個(gè)對(duì)象任何一個(gè)的原型都會(huì)影響另外一個(gè),這在大多的情況下是不可取的。當(dāng)對(duì)象查找一個(gè)屬性的時(shí)候,他會(huì)沿著原型鏈一直往上追蹤,直到直到為之。在性能方面,原則上應(yīng)該盡量避免原型鏈太長。 簡介 如果之間學(xué)習(xí)過cpp 、java 之類的語言,都會(huì)知道他們是可以基于類 class 進(jìn)行繼承的, 在JavaScript 中,并沒有類繼承這個(gè)概念,要實(shí)...
摘要:然而,對(duì)象字面量不是真正意義上的哈希映射,如果使用不當(dāng)可能會(huì)構(gòu)成潛在的隱患??諏?duì)象創(chuàng)建一個(gè)真正的哈希映射的秘訣就是避免原型,及其帶來的包袱。在此之前,甚至之后,你應(yīng)該使用空對(duì)象滿足你所有的基本哈希映射需求。 在JavaScript中存儲(chǔ)鍵值對(duì)的一個(gè)簡單常見的方法是使用對(duì)象字面量。然而,對(duì)象字面量不是真正意義上的哈希映射,如果使用不當(dāng)可能會(huì)構(gòu)成潛在的隱患。雖然目前JavaScrip...
摘要:參考內(nèi)容關(guān)于本文本文轉(zhuǎn)自大叔的深入理解系列深入理解系列文章,包括了原創(chuàng),翻譯,轉(zhuǎn)載,整理等各類型文章,原文是大叔的一個(gè)非常不錯(cuò)的專題,現(xiàn)將其重新整理發(fā)布。 前言 JavaScript 不包含傳統(tǒng)的類繼承模型,而是使用 prototypal 原型模型。 雖然這經(jīng)常被當(dāng)作是 JavaScript 的缺點(diǎn)被提及,其實(shí)基于原型的繼承模型比傳統(tǒng)的類繼承還要強(qiáng)大。實(shí)現(xiàn)傳統(tǒng)的類繼承模型是很簡單,但是...
閱讀 1991·2021-09-26 10:19
閱讀 3267·2021-09-24 10:25
閱讀 1655·2019-12-27 11:39
閱讀 1938·2019-08-30 15:43
閱讀 683·2019-08-29 16:08
閱讀 3515·2019-08-29 16:07
閱讀 915·2019-08-26 11:30
閱讀 1279·2019-08-26 10:41