谁能启发我,两者之间有什么区别hasOwnPropertypropertyIsEnumerable:

function f(){
  this.a = 1;
  this.b = 2;
  this.c = function(){}
}
f.prototype = {
  d : 3,
  e : 4,
  g : function(){}
}

//creating the instance of an object:
var o = new f();

//And here I can't see difference.
//In my opinion they are doing the same thing
console.log("o.hasOwnProperty('a'):", o.hasOwnProperty('a')); //true
console.log("o.hasOwnProperty('b'):", o.hasOwnProperty('b')); //true
console.log("o.hasOwnProperty('c'):", o.hasOwnProperty('c')); //true
console.log("o.hasOwnProperty('d'):", o.hasOwnProperty('d')); //false
console.log("o.hasOwnProperty('e'):", o.hasOwnProperty('e')); //false
console.log("o.hasOwnProperty('g'):", o.hasOwnProperty('g')); //false

console.log("o.propertyIsEnumerable('a')", o.propertyIsEnumerable('a')); //true
console.log("o.propertyIsEnumerable('b')", o.propertyIsEnumerable('b')); //true
console.log("o.propertyIsEnumerable('c')", o.propertyIsEnumerable('c')); //true
console.log("o.propertyIsEnumerable('d')", o.propertyIsEnumerable('d')); //false
console.log("o.propertyIsEnumerable('e')", o.propertyIsEnumerable('e')); //false
console.log("o.propertyIsEnumerable('g')", o.propertyIsEnumerable('g')); //false

如我错了请纠正我

最佳答案

“propertyIsEnumerable”函数始终排除不会为“hasOwnProperty”返回true的属性。您没有做任何事情来使任何属性都无法枚举,因此在测试中结果是相同的。

您可以使用“defineProperty”定义不可枚举的属性; MDN的see this reference

Object.defineProperty(obj, "hideMe", { value: null, enumerable: false });

这就像:
obj.hideMe = null;

但该属性不会显示在for ... in循环中,并且使用propertyIsEnumerable进行的测试将返回false

如果不是很明显,那么整个主题都是关于旧浏览器不具备的功能。

关于javascript - hasOwnProperty vs propertyIsEnumerable,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10968962/

10-12 02:43