JS:对象成员检测(instanceof 、isPrototypeOf 、hasOwnProperty() 、propertyIsEnumerable())
检测对象成员我使用到了以下运算符和方法:
instanceof 、isPrototypeOf 、hasOwnProperty() 、propertyIsEnumerable()
1、instanceof
是什么?检测构造函数的 prototype 属性是否出现在某个实例对象的原型链上。
function Parent() {}; function Child() {}; var child=new Child(); console.log(child instanceof Parent); //false console.log(child instanceof Child); //true function Parent() {}; function Child() {}; Child.prototype=new Parent(); var child=new Child(); console.log(child instanceof Parent); //true console.log(child instanceof Child); //true
学习了原型对象后,理解这个例子:
new Child创建了一个新的对象,那个对象与Child共用一个原型对象,其他同理。
2、isPrototypeOf
判断一个对象象是否为一个实例的原型。
function Parent() {}; function Child() {}; Child.prototype=new Parent(); var c1=new Child(); console.log(Parent.prototype.isPrototypeOf(c1)); //true console.log(Child.prototype.isPrototypeOf(c1)); //true console.log(Child.isPrototypeOf(c1)); //false
3、hasOwnProperty()
判断对象是否有某个特定的属性,(注意说的是对象的属性,而不是对象原型的属性)
必须用字符串指定该属性。
function Parent() { this.life=1; } function Child() { this.name="karen"; } Child.prototype=new Parent(); var c1=new Child(); console.log(c1.hasOwnProperty("name"));//true console.log(c1.hasOwnProperty("life"));//false
4、propertyIsEnumerable()
判断给定的属性是否可以用 for...in 语句进行枚举。
由于 for ... in 枚举是包含原型链上的属性的,
但propertyIsEnumerable作用于原型方法上时,始终是返回false的,
你可以这么认为,for...in可以枚举对象本身的属性和原型上的属性,
而propertyIsEnumerable只能判断本身的属性是否可以枚举。
此外,预定义的属性不是可列举的,而用户定义的属性总是可列举的。
所以如果你只想遍历对象本身的属性,可以
<div class="box">1</div> <div class="box">2</div> <div class="box">3</div> <div class="box">4</div> <script> var arr = document.querySelectorAll(".box"); console.log(arr); for (var i in arr) { //for-in能便历的对象的成员就是可遍历成员 if (arr.propertyIsEnumerable(i)) { console.log(i); // [div.box, div.box, div.box, div.box] } } var arr=[10,20,304]; console.log(arr.propertyIsEnumerable(1));//true </script>
在条件语句if种使用propertyIsEnumerable()做条件判断
var obj = { name: 'lili', age: 10 }; for (var key in obj) { if (obj.propertyIsEnumerable(key)) { console.log(key); //name age console.log(obj[key]); //lili 10 } }