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