JavaScript 中的Function 可以称为“第一类”,因为它是一个可调用对象,这意味着它是一个添加了可调用语义的对象。在某些方面,JavaScript 中的 Array 与 Function 相似,因为它们都是对象,但包含特殊功能。 注意:关于 JavaScript 的常见说法是 "everything is an object",但事实并非如此。 简单原语(string、boolean、number、null 和 undefined)都不是对象(尽管如果您尝试将它们视为这样)。
var obj = {bar: 'hi'};
Object.keys(obj); // ["bar"]
function func() {}
Object.keys(func); // []
func.bar = 'hello';
Object.keys(func); // ["bar"];
var arr = [1, 2, 3];
Object.keys(arr); // ["0", "1", "2"]
arr.bar = 'hey';
Object.keys(arr); // ["0", "1", "2", "bar"]
bar 出现在所有三个中,因为这些属性默认设置为enumerable。但是,正如您所指出的,一个函数还有一些其他属性,但这些属性没有显示出来。为什么?我们先看obj。
obj.propertyIsEnumerable('bar'); // true
bar 默认设置为enumerable。
现在让我们看看func 中的bar。
func.propertyIsEnumerable('bar'); // true
这就解释了为什么bar 出现在func 但name 呢?
func.propertyIsEnumerable('name'); // false
啊啊!它是不可枚举的。对于通过 JavaScript 引擎自动链接或分配给对象的许多属性/方法来说,情况都是如此。例如,数组对象的length 属性。
arr.propertyIsEnumerable('length'); // false
话虽如此,如果您是 JS 新手,我强烈建议您阅读 Kyle Simpson 的 You Don't Know JS 系列。它适用于具有一定编程经验的人,但它们对于了解 JS 是什么和不是什么非常有用(无论堆放了多少语法糖)。 我特别推荐关注经典继承与 JavaScript 的OLOO (Objects Linking to Other Objects).987654324@的区别关键点
介绍书Up & Going 是一本快速阅读书,涵盖了整个系列将深入探讨的基础知识。该系列的其余部分(到目前为止)包括:Types & Grammar、Scopes & Closures、this & Object Prototypes、Async & Performance 和 ES6 & Beyond。你也可以在他的github repository上预览它们。
或您还可以查看 MDN 的 Working with Objects 文档以获取一些非常好的信息。