2010年12月8日星期三

javascript自定义类生成对象hasOwnProperty,propertyIsEnumerable以及for in问题

做一个项目,想在Object的prototype上扩展某些方法,让生成的对象能够直接调用这个方法,但是在for in的时候出了问题,在Object的prototype上定义的方法被枚举出来了,这样改动会直接影响到javascript的for in逻辑,遂做检查。

看手册介绍,hasOwnProperty是判断对象是否有某个属性,和原型无关,propertyIsEnumerable是判断对象某个属性是否可以枚举,也和原型无关,demo代码是:

var o = new Object( );               // Create an object
o.x = 3.14; // Define a property
o.propertyIsEnumerable("x"); // true: property x is local and enumerable
o.propertyIsEnumerable("y"); // false: o doesn't have a property y
o.propertyIsEnumerable("toString"); // false: toString property is inherited
Object.prototype.propertyIsEnumerable("toString"); // false: nonenumerable
但是这段代码会怎样呢?

var Car = function(){};
Car.prototype.hello = function(){
    alert("hello car");
};
var car = new Car();
alert(car.hasOwnProperty("hello"));              // false,因为car本身没有hello方法
alert(car.propertyIsEnumerable("hello"));   // false,没有这个方法当然不能枚举
alert(car.constructor.prototype.hasOwnProperty("hello"));// true,car的类Car的原型有hello方法
alert(car.constructor.prototype.propertyIsEnumerable("hello"));// true, car的类的Car的原型hello方法是可以被枚举的
for(var k in car){
    alert(k);     // alert出了hello
}
这里就有一个问题,使用propertyIsEnumerable判断car的"hello"是否能枚举,为false,但是直接进行枚举就出了”hello”,无论如何这是说不通的。

没有评论:

发表评论