剛在阮一峰大神書中看到如下代碼,對于最后一個結(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(這里有疑惑)
自己一直都認為
Object.prototype.hasOwnProperty.call(obj, 'toString')
// 等價于
obj.hasOwnProperty('toString')
然后再chrome 的console里試了下
var obj = {};
obj.hasOwnProperty('toString') === Object.prototype.hasOwnProperty.call(obj, 'toString')
// log: true
這兩種表達式是全等的呀,明明只是寫法不同。
所以阮大神的那個代碼里,最后一個到底為什么是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í)行的還是全局的funcvar 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的屬性,這個屬性的值是一個方法,當對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ù)的返回值;
另外當你沒有在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年。依托北京大學優(yōu)質(zhì)雄厚的教育資源和背景,秉承“教育改變生活”的發(fā)展理念,致力于培養(yǎng)中國IT技能型緊缺人才,是大數(shù)據(jù)專業(yè)的國家
達內(nèi)教育集團成立于2002年,是一家由留學海歸創(chuàng)辦的高端職業(yè)教育培訓機構(gòu),是中國一站式人才培養(yǎng)平臺、一站式人才輸送平臺。2014年4月3日在美國成功上市,融資1
北大課工場是北京大學校辦產(chǎn)業(yè)為響應(yīng)國家深化產(chǎn)教融合/校企合作的政策,積極推進“中國制造2025”,實現(xiàn)中華民族偉大復(fù)興的升級產(chǎn)業(yè)鏈。利用北京大學優(yōu)質(zhì)教育資源及背
博為峰,中國職業(yè)人才培訓領(lǐng)域的先行者
曾工作于聯(lián)想擔任系統(tǒng)開發(fā)工程師,曾在博彥科技股份有限公司擔任項目經(jīng)理從事移動互聯(lián)網(wǎng)管理及研發(fā)工作,曾創(chuàng)辦藍懿科技有限責任公司從事總經(jīng)理職務(wù)負責iOS教學及管理工作。
浪潮集團項目經(jīng)理。精通Java與.NET 技術(shù), 熟練的跨平臺面向?qū)ο箝_發(fā)經(jīng)驗,技術(shù)功底深厚。 授課風格 授課風格清新自然、條理清晰、主次分明、重點難點突出、引人入勝。
精通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)師。