Object.prototype.hasOwnProperty()
所有继承了 Object
的对象都会继承到 hasOwnProperty
方法。这个方法可以用来检测一个对象是否含有特定的自身属性;和 in
运算符不同,该方法会忽略掉那些从原型链上继承到的属性。
使用 hasOwnProperty
方法判断属自身属性与继承属性
function Demo(name){
this.name=name||'Tom';//自身属性
}
Demo.prototype.age='10';
var demo=new Demo('lilei');
//原型链的,非私有的属性
console.log(demo.hasOwnProperty('age'));//false
console.log(demo.hasOwnProperty('toString'));// 返回 false
//自身属性
console.log(demo.hasOwnProperty('name'));//true
使用 hasOwnProperty
作为属性名
JavaScript 并没有保护 hasOwnProperty 属性名,因此某个对象是有可能存在使用这个属性名的属性,使用外部的 hasOwnProperty 获得正确的结果是需要的:
var foo = {
hasOwnProperty: function() {
return false;
},
bar: 'Here be dragons'
}; foo.hasOwnProperty('bar'); // 始终返回 false // 如果担心这种情况,可以直接使用原型链上真正的 hasOwnProperty 方法
({}).hasOwnProperty.call(foo, 'bar'); // true // 也可以使用 Object 原型上的 hasOwnProperty 属性
Object.prototype.hasOwnProperty.call(foo, 'bar'); // true
Object.getOwnPropertyNames()
Object.getOwnPropertyNames()
方法返回一个由指定对象的所有自身属性的属性名(包括不可枚举属性但不包括Symbol值作为名称的属性)组成的数组。
Object.getOwnPropertyNames()
返回一个数组,该数组对元素是 obj
自身拥有的枚举或不可枚举属性名称字符串。 数组中枚举属性的顺序与通过 for...in
循环(或 Object.keys
)迭代该对象属性时一致。数组中不可枚举属性的顺序未定义。
示例
var arr = ["a", "b", "c"];
console.log(Object.getOwnPropertyNames(arr).sort()); // ["0", "1", "2", "length"] // 类数组对象
var obj = { 0: "a", 1: "b", 2: "c"};
console.log(Object.getOwnPropertyNames(obj).sort()); // ["0", "1", "2"] // 使用Array.forEach输出属性名和属性值
Object.getOwnPropertyNames(obj).forEach(function(val, idx, array) {
console.log(val + " -> " + obj[val]);
});
// 输出
// 0 -> a
// 1 -> b
// 2 -> c //不可枚举属性
var my_obj = Object.create({}, {
getFoo: {
value: function() { return this.foo; },
enumerable: false
}
});
my_obj.foo = 1; console.log(Object.getOwnPropertyNames(my_obj).sort()); // ["foo", "getFoo"]
如果你只要获取到可枚举属性,查看Object.keys
或用for...in
循环(还会获取到原型链上的可枚举属性,不过可以使用hasOwnProperty()
方法过滤掉)。
下面的demo也是不会获取到原型链上的属性
function ParentClass() {}
ParentClass.prototype.inheritedMethod = function() {}; function ChildClass() {
this.prop = 5;
this.method = function() {};
} ChildClass.prototype = new ParentClass;
ChildClass.prototype.prototypeMethod = function() {}; console.log(
Object.getOwnPropertyNames(
new ChildClass() // ["prop", "method"]
)
);