for-in可以将一个对象的所有属性(包括原型(继承)属性的实例属性(原型属性中存在但是被该对象覆盖了原来原型中的值))。
可以使用hasOwnProperty()方法检测一个对象的属性是实例属性(true)还是原型属性(false)。即是,只有对象覆盖了属性在原型中的值之后才会返回true,这时候才算是一个实例属性。
定义原型:
Person.prototype = {
constructor:Person,
name:"Mike",
age:29,
job:"Software Engineer",
sayName:function(){
alert(this.name);
}
}
利用以上方法定义原型会使对象的constructor不再指向
Person
而是指向
Object
;
解决方法是:在定义Person原型的时候手动将constructor属性的值设置成为(当前对象名)Person。
但是,这种方法将使得constructor属性的【Enumberable】设置为true,即是用for-in方法枚举对象的属性时constructor也会被枚举出来。
How to fix:
利用EcmaScript中定义的设置属性特性的方法
Object.defineProperty(ObjectName,"constructor",{
enumberable:false,
value:ObjectName
});
局限:
这些修补
只能在ECMAScript 5兼容的浏览器上起作用