这里总结了区分实例属性和原型属性的几个方法。
所有继承了Object.prototype的对象都会从原型链上继承到hasOwnProperty()方法,这个方法可以用来检测对象是否含有特定的自身属性,和in运算符不同,该方法会自动忽略那些从原型链上继承到的属性和方法。
1 2 3 4 5
| o = new Object(); o.name = 'xwj'; o.hasOwnProperty('name'); o.hasOwnProperty('toString'); o.hasOwnProperty('hasOwnProperty');
|
无论是实例属性还是原型属性,只要实例对象能够访问的到,就返回true。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| var myArr = ['apple', 'orange', 'banana']; console.log(0 in myArr); console.log(2 in myArr); console.log('orange' in myArr); console.log("length" in myArr); console.log(PI in Math); var myObj = new Object(); myObj.name = 'xwj'; myObj.prototype.sayName = function () { console.log(this.name); } console.log('name' in myObj); console.log('sayName' in myObj);
|
for-in循环,返回的是所有能够通过实例对象访问的、可枚举的属性,也包括实例属性和原型属性。
获取所有原型属性
1 2 3
| function getPrototypeProperty (Object, name) { return !Object.hasOwnProperty(name) && (name in object); }
|
获取所有可以枚举的实例属性
使用Object.keys()方法即可获取所有可以枚举的实例属性。
该方法接收一个对象作为参数,返回一个包含所有枚举属性的字符串数组。
1
| console.log(Object.keys(myObj));
|
获取所有实例属性
Object.getOwnPropertyNames()方法可以获取对象所有的实例属性,无论这个属性能否枚举。
1
| console.log(Object.getOwnPropertyNames(myObj));
|