剛在阮一峰大神書中看到如下代碼,對于最后一個結(jié)果是 false 很疑惑。
var obj = {};
obj.hasOwnProperty('toString') // false
// 覆蓋掉繼承的 hasOwnProperty 方法
obj.hasOwnProperty = function () {
return true;
};
obj.hasOwnProperty('toString') // true
Object.prototype.hasOwnProperty.call(obj, 'toString') // false(這里有疑惑)
自己一直都認(rèn)為
Object.prototype.hasOwnProperty.call(obj, 'toString')
// 等價于
obj.hasOwnProperty('toString')
然后再chrome 的console里試了下
var obj = {};
obj.hasOwnProperty('toString') === Object.prototype.hasOwnProperty.call(obj, 'toString')
// log: true
這兩種表達(dá)式是全等的呀,明明只是寫法不同。
所以阮大神的那個代碼里,最后一個到底為什么是false??
求大神解答,謝謝。
call
方法只是調(diào)用一個方法,只不是是調(diào)用的時候把this設(shè)置成了你傳入的第一個參數(shù)。
Object.prototype.hasOwnProperty.call(obj, 'toString')
// 怎么可能等價于?他們調(diào)用的函數(shù)是兩個完全不同的函數(shù)!
obj.hasOwnProperty('toString')
下面這樣:
var obj = {};
obj.func = function(){
console.log('func of obj')
}
function func(){
console.log('func of global');
}
func.call(obj)//執(zhí)行的還是全局的func
var obj = {};
obj.hasOwnProperty方法繼承于Object.prototype,用于檢查對象是否具有自己定義的屬性
obj沒有toString這個屬性,所以obj.hasOwnProperty('toString')為 false
obj.hasOwnProperty = function () {
return true;
}
這里定義了一個obj 的自有屬性 hasOwnProperty,遮蔽了obj的原型對象 Object.prototype 的 hasOwnProperty
因此obj.hasOwnProperty('toString')順著原型鏈先找到了自有屬性,所以結(jié)果為 true
Object.prototype.hasOwnProperty.call(obj, 'toString'),是用了Object.prototype上的hasOwnProperty屬性,不是用的自身屬性,所以為 false
所以obj.hasOwnProperty('toString') 和 Object.prototype.hasOwnProperty.call(obj, 'toString')
都是 false
自然是相等的。。。。
因為call方法把hasOwnProperty方法定義到了prototype里,所以會返回false。
var obj = {};
obj.hasOwnProperty('toString') === Object.prototype.hasOwnProperty.call(obj, 'toString')
這個之所以返回true,是因為兩個都是object類型,而且都沒定義,值都是空。
var obj = {};
obj.hasOwnProperty('toString123') === Object.prototype.hasOwnProperty.call(obj, 'toString456')
這個也是相等的
對象查找屬性是沿著原型鏈的,在查找一個屬性的時候,會首先查看對象自己有沒有這個屬性,如果沒有就會去對象的原型鏈上去查找,如果沒有就去對象的原型鏈的原型鏈查找...
hasOwnProperty
是用來判斷對象自己是否含有某個屬性的函數(shù),不會去查找原型鏈,我們知道hasOwnProperty
是定義在Object.prototype上的。
var obj = {};
obj.hasOwnProperty('toString')
此時obj自身不包含任何屬性和方法,所以對obj.hasOwnProperty
求值的時候,會去查找原型鏈,最后在原型上找到了該方法;
因為toString
不是obj
自身含有的方法,是原型鏈中的方法,所以返回false
。
// 覆蓋掉繼承的 hasOwnProperty 方法
obj.hasOwnProperty = function () {
return true;
};
obj.hasOwnProperty('toString')
此時obj
有一個名字為hasOwnProperty
的屬性,這個屬性的值是一個方法,當(dāng)對obj.hasOwnProperty
求值的時候,因為obj
本身含有這個屬性,所以不會去原型鏈上查找,這個函數(shù)的作用就是返回true
,所以結(jié)果是true
。
Object.prototype.hasOwnProperty.call(obj, 'toString')
此時你調(diào)用的是Object.prototype.hasOwnProperty
這個方法,obj
自身是不包含toString
屬性的,所以返回false。
var obj = {};
obj.hasOwnProperty('toString') === Object.prototype.hasOwnProperty.call(obj, 'toString')
obj.hasOwnProperty('toString')
的結(jié)果和Object.prototype.hasOwnProperty.call(obj, 'toString')
的結(jié)果都是false
,false === false
的結(jié)果是true
,你應(yīng)該比較兩個函數(shù),而不是函數(shù)的返回值;
另外當(dāng)你沒有在obj
上定義hasOwnProperty
的時候,對obj.hasOwnPeoperty
求值的結(jié)果就是在原型鏈中定義的同名函數(shù),也就是Object.prototype.hasOwnProperty
,所以你即使使用obj.hasOwnProperty === Object.prototype.hasOwnProperty
結(jié)果仍然是true
;
你需要在obj
上定義hasOwnProperty
之后再去判斷兩個函數(shù)是否相等,此時就不相同了。
var obj = {}
obj.hasOwnProperty = function() {return true}
obj.hasOwnProperty === Object.prototype.hasOwnProperty // false
北大青鳥APTECH成立于1999年。依托北京大學(xué)優(yōu)質(zhì)雄厚的教育資源和背景,秉承“教育改變生活”的發(fā)展理念,致力于培養(yǎng)中國IT技能型緊缺人才,是大數(shù)據(jù)專業(yè)的國家
北大青鳥中博軟件學(xué)院創(chuàng)立于2003年,作為華東區(qū)著名互聯(lián)網(wǎng)學(xué)院和江蘇省首批服務(wù)外包人才培訓(xùn)基地,中博成功培育了近30000名軟件工程師走向高薪崗位,合作企業(yè)超4
中公教育集團創(chuàng)建于1999年,經(jīng)過二十年潛心發(fā)展,已由一家北大畢業(yè)生自主創(chuàng)業(yè)的信息技術(shù)與教育服務(wù)機構(gòu),發(fā)展為教育服務(wù)業(yè)的綜合性企業(yè)集團,成為集合面授教學(xué)培訓(xùn)、網(wǎng)
達(dá)內(nèi)教育集團成立于2002年,是一家由留學(xué)海歸創(chuàng)辦的高端職業(yè)教育培訓(xùn)機構(gòu),是中國一站式人才培養(yǎng)平臺、一站式人才輸送平臺。2014年4月3日在美國成功上市,融資1
曾工作于聯(lián)想擔(dān)任系統(tǒng)開發(fā)工程師,曾在博彥科技股份有限公司擔(dān)任項目經(jīng)理從事移動互聯(lián)網(wǎng)管理及研發(fā)工作,曾創(chuàng)辦藍(lán)懿科技有限責(zé)任公司從事總經(jīng)理職務(wù)負(fù)責(zé)iOS教學(xué)及管理工作。
浪潮集團項目經(jīng)理。精通Java與.NET 技術(shù), 熟練的跨平臺面向?qū)ο箝_發(fā)經(jīng)驗,技術(shù)功底深厚。 授課風(fēng)格 授課風(fēng)格清新自然、條理清晰、主次分明、重點難點突出、引人入勝。
精通HTML5和CSS3;Javascript及主流js庫,具有快速界面開發(fā)的能力,對瀏覽器兼容性、前端性能優(yōu)化等有深入理解。精通網(wǎng)頁制作和網(wǎng)頁游戲開發(fā)。
具有10 年的Java 企業(yè)應(yīng)用開發(fā)經(jīng)驗。曾經(jīng)歷任德國Software AG 技術(shù)顧問,美國Dachieve 系統(tǒng)架構(gòu)師,美國AngelEngineers Inc. 系統(tǒng)架構(gòu)師。