捕获原生原型的内容

时间:2011-06-05 15:49:27

标签: javascript

尝试并执行以下操作:

for (var key in String.prototype)
    console.log(key);

它给你......什么都没有(好吧,除非你自己定义了一些外来的东西。)但是,你仍然有String.prototype.split例如。我在其他所有本地对象(NumberArrayObject)上尝试了相同的结果。

以下也“不起作用”:

for (var key in Array)
    console.log(key);

虽然例如Array.isArray

Object.keys(Array.prototype)给出一个空数组,Object.keys(Array)也是如此。但是,Object.keys(jQuery)例如提供了一个巨大的数组,正如预期的那样。

那么,为什么我们不能迭代浏览器提供的本机,但仍然可以访问它们?

1 个答案:

答案 0 :(得分:3)

来自MDC page for for..in

  

for...in循环不会迭代内置属性

原因是Javascript中的属性是可枚举的或不可枚举的; “enumerable”表示您可以在for..in循环中访问该属性。所有内置属性都是不可枚举的。

现代浏览器支持Object.getOwnPropertyNames方法:

console.log(Object.getOwnPropertyNames(Array.prototype));
// ["length", "constructor", "concat", "map", "sort", "join", "indexOf", "filter", "some", "toString", "reduceRight", "splice", "forEach", "shift", "unshift", "toLocaleString", "lastIndexOf", "reverse", "reduce", "pop", "push", "every", "slice"]