原型中自定义函数和本机函数之间的区别

Leo*_*Leo 6 javascript

“ For In”可以遍历数组(值/属性/函数)。

let arr = [1,2,3,4];
arr.__proto__.con = function(){console.log('from array');}
for(let item in arr){
 console.log(item);
}

Run Code Online (Sandbox Code Playgroud)

结果将是:

1,2,3,4,con
Run Code Online (Sandbox Code Playgroud)

为什么不打印“ toString” /“ split”之类的本机功能?有什么不同?

在我看来,它们(contoString)都属于Array的原型。

小智 3

for...in声明...

迭代对象的所有非Symbol、可枚举属性。来源:MDN

但是,如果您查看ECMA 规范,在“数组原型对象的属性”项中,您会看到:

数组原型对象是内在对象%ArrayPrototype%。Array 原型对象是一个 Array 奇异对象,并且具有为此类对象指定的内部方法。它有一个 length 属性,其初始值为 0,其属性为 { [[Writable]]: true, [[Enumerable]]: false , [[Configurable]]: false }。

这适用于concat,,,,,等等......filtermapforEachsorttoString

您可以使用Object.getOwnPropertyDescriptor它来检查这些属性。例如:

console.log(Object.getOwnPropertyDescriptor(Array.prototype, "concat"));
Run Code Online (Sandbox Code Playgroud)

最后,要设置这些方法{enumerable: false},请查看其他答案