在面向对象的开发工做中,常常会遇到检查对象属性和遍历对象属性的状况。 JavaScript 不包含如 java、C 等语言的传统类继承模型,而是使用 prototype 原型模型。java
JavaScript 原型链继承中属性查找过程
当查找一个对象的属性时,JavaScript 会向上遍历原型链,直到找到给定名称的属性为止。
到查找到达原型链的顶部 - 也就是 Object.prototype - 可是仍然没有找到指定的属性,就会返回 undefined。
使用 for in 循环能够遍历对象全部的属性,包括该对象在原型链中的属性,如:
数组
var a = {
a:1,
b:2
};
var b = Object.create(a);
b.c = 3;
var c = Object.create(b);
c.d = 4;
for(var key in c){
console.log(c[key])
}
//会在控制台中依次打印出4 3 1 2
注意在控制台中打印的顺序是 4 3 1 2,而不是 1 2 3 4,这就解释了原型链继承时查找属性的过程是先查找自身属性,当自身属性不存在时,会在原型链中逐级查找。
有时候咱们并不想要这样的结果,咱们只想要获取对象自身的属性(不包括对象原型链上的属性),何况每次遍历都要查找对象的原型链,这样会形成性能负担。
hasOwnProperty 函数
hasOwnProperty 函数能够用来检查对象自身是否含有某个属性,返回值是布尔值,当属性不存在时不会向上查找对象原型链。
用个例子来看看 hasOwnProperty 和 for in 的区别:
函数
if(var "a" in c){
console.log(c["a"]) //属性 a 是原型链上的属性, 输出 1
}
if(c.hasOwnProperty("a")){
console.log(c["a"]) //属性 a 不是自身属性,不会执行这一步
}
getOwnPropertyNames 函数
getOwnPropertyNames 函数能够获取对象全部的自身属性,返回值是由对象自身属性名称组成的数组,一样不会向上查找对象原型链。
如:
性能
console.log(Object.getOwnPropertyNames(c)) //输出 ["d"]
getOwnPropertyNames 函数遍历全部对象全部自身属性,例:
prototype
(fucntion(){ var propertys = Object.getOwnPropertyNames(c); var len = propertys.length; for(var i = 0; i < len; i++){ var key = propertys[i]; console.log(c[key]) //输出 4 } })(); 更多精彩内容分享,加群434623999