JavaScript中isPrototypeOf、instanceof和hasOwnProperty函數的用法詳解
isPrototypeOf
作用:檢測一個對象是否是另一個對象的原型?;蛘哒f一個對象是否被包含在另一個對象的原型鏈中
var p = {x:1};//定義一個原型對象
var o = Object.create(p);//使用這個原型創(chuàng)建一個對象
p.isPrototypeOf(o);//=>true:o繼承p
Object.prototype.isPrototypeOf(p);//=> true p繼承自Object.prototype以上實例來自與《JavaScript權威指南》,簡單解釋一下就是每一個JavaScript對象都和原型關聯,每一個對象都從原型繼承屬性。所有通過對象直接量創(chuàng)建的對象都使用Object.prototype作為他們的原型,因此p是繼承自Object.prototype,因此在p的原型鏈中一定存在Object.prototype。
上面還提到了Object.create();該方法創(chuàng)建一個新對象,第一個參數是這個對象的原型,所以上面創(chuàng)建的o對象它的原型就是p;
function Animal(){
this.species = "動物";
};
var eh = new Animal();
Animal.prototype.isPrototypeOf(eh)//=>true以上實例是通過new創(chuàng)建了對象eh,使用構造函數Animal的prototype作為它的原型。
綜合上面的兩個例子,我們發(fā)現在調用isPrototypeOf()的時候有三種方式
p.isPrototypeOf(o);//=>true Object.prototype.isPrototypeOf(p); Animal.prototype.isPrototypeOf(eh)//=>true
總結一下就是:
通過Object.create()創(chuàng)建的對象使用第一個參數作為原型
通過對象直接量的對象使用Object.prototype作為原型
通過new創(chuàng)建的對象使用構造函數的prototype屬性作為原型
instanceof
instanceof運算符希望左操作數是一個對象,右操作數標識對象的類。如果左側對象是右側類的實例,則表達式返回為true,否則返回false。
var d = new Date(); d instanceof Date;//=>true d是Date的實例 d instanceof Object;//=>true 所有對象都是Object的實例
當通過instanceof判斷一個對象是否是一個類的實例的時候,這個判斷也會包含對父類的檢測。盡管instanceof的右操作數是構造函數,但計算過程實際是檢測了對象的繼承關系。
instanceOf與isPrototypeOf簡單總結
var d = new Date(); Date.prototype.isPrototypeOf(d);//=>true d instanceof Date;//=>true
- 如果Date.prototype是d的原型,那么d一定是Date的實例。
- 缺點為無法同對象來獲得類型,只能檢測對象是否屬于類名
- 在多窗口和多框架的子頁面的web應用中兼容性不佳。其中一個典型代表就是instanceof操作符不能視為一個可靠的數組檢測方法。
hasOwnProperty
檢測集合成員的所屬關系,判斷某個屬性是否存在于某個對象中??梢酝ㄟ^in運算符,hasOwnProperty()來完成。
in運算符左側是屬性名,右側是字符串,如果對象的自由屬性或者繼承屬性中包含這個屬性則返回true。
對象的hasOwnProperty()方法用來檢測給定的名字是否是對象的自由屬性,如果是繼承屬性則返回false。
function Animal(){}//定義Animal構造函數
Animal.prototype = {//定義Animal原型
species:"動物",
say:function(){
console.log('i can say word');
}
}
function Cat(name,color){//定義構造函數Cat
this.name = name;
this.color = color;
}
var F = function(){};
F.prototype = Animal.prototype;
Cat.prototype = new F();
Cat.prototype.constructor = Cat;//Cat繼承Animal 用F空對象作為媒介
var eh = new Cat('lili','white');//實例化對象
console.log('say' in eh)//=>true
console.log('name' in eh)//=>true
console.log('color' in eh)//=>true
console.log('species' in eh)=>true
console.log(eh.hasOwnProperty('say'))=>false 由于say為繼承屬性 非自有屬性
console.log(eh.hasOwnProperty('species'))=>false 由于species為繼承屬性 非自有屬性
console.log(eh.hasOwnProperty('name'))=>true
console.log(eh.hasOwnProperty('color'))=>true
for(var key in eh){
console.log(key);
if(eh.hasOwnProperty(key)){
console.log(key) //=>species say name color
}
}以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
De facto standard 世界上不可思議的事實標準
前些天IEBlog中提到實現互通并不是只靠標準就行,其中舉出了一些關于事實上的標準的考慮——所謂“事實上的標準”,也就是并非標準,但大家都遵循著它去做事情的那么一種東西。2010-08-08
深入理解JavaScript系列(21):S.O.L.I.D五大原則之接口隔離原則ISP詳解
這篇文章主要介紹了深入理解JavaScript系列(21):S.O.L.I.D五大原則之接口隔離原則ISP詳解,本文講解了JavaScript接口、ISP與JavaScript、墮落的實現、靜態(tài)耦合、語義耦合、可擴展性等內容,需要的朋友可以參考下2015-03-03
document.styleSheets[0].disabled
document.styleSheets[0].disabled...2006-10-10

