设计:为什么JavaScript有独立的函数和对象对象,为什么它们有自己独立的原型对象?
我遇到了一条看起来很乱的路 所以我的问题来了: 为什么JavaScipt有单独的函数和对象函数对象 (而不是简单地在顶层定义所有内容。) 由用户指向单个原型对象根,并与原型一起 根指向根,这似乎更简单 还有更直观的设计 谢谢设计:为什么JavaScript有独立的函数和对象对象,为什么它们有自己独立的原型对象?,javascript,prototype,prototypal-inheritance,prototype-programming,Javascript,Prototype,Prototypal Inheritance,Prototype Programming,我遇到了一条看起来很乱的路 所以我的问题来了: 为什么JavaScipt有单独的函数和对象函数对象 (而不是简单地在顶层定义所有内容。) 由用户指向单个原型对象根,并与原型一起 根指向根,这似乎更简单 还有更直观的设计 谢谢 对不起,我误会了。现在我意识到: JavaScript具有基本数据类型和对象。基本数据类型是 布尔值、数字、字符串、null和未定义。需要的时候,前三个 它们被视为布尔、数字和字符串的实例。一切 else是一个对象,包括函数、数组、正则表达式和 日期。函数可以用作构造函
对不起,我误会了。现在我意识到:
- JavaScript具有基本数据类型和对象。基本数据类型是
布尔值、数字、字符串、null和未定义。需要的时候,前三个
它们被视为布尔、数字和字符串的实例。一切
else是一个对象,包括函数、数组、正则表达式和
日期。函数可以用作构造函数或普通函数。
当函数用作构造函数时,它可以用来实例化
通过新操作符创建对象实例。实例化对象的原型
实例(通过
属性访问)设置为构造函数的 实例化实例时的“prototype”属性。\uuu proto\uu
成员用于通过原型继承链解析属性 因为函数比对象更专业化,所以有一个Function.prototype 对象卡在函数和 顶级对象。原型对象。函数和对象构造函数 功能本身通常不需要,因为我们可以 直接使用函数关键字和对象文字\uuuuuuuuuuuuuu
内部属性设置为已解析函数体的值(函数的代码)[[Call]]
内部属性也设置为函数体(这就是为什么所有函数都可以用作构造函数)[[Construct]]
内部属性用于引用实现的内部代码,从而使[[HasInstance]]
工作instanceOf
[[code]]
,[[FormalParameters]]
,[[Scope]]
,以及其他。换句话说,函数对象在很多方面都非常特殊。但是,就其与函数原型的关系而言,它并不是真正特殊的。在函数对象本身的属性查找过程中,会参考函数原型。例如,在解析类似以下表达式时:
var bound = function() { alert(this); }.bind("hello");
运行时必须找到属性“bind”。它不会在函数对象本身上找到,但会在原型上找到。因为函数实例不同于对象实例。它们是函数。但我的理解是,在JavaScript中,所有内容都是对象和函数。请参阅以下帖子:@JohnSonderson恐怕你的理解不正确。不是JavaScript中的所有东西都是对象,当然也不是所有东西都是函数。@JohnSonderson:不是。每个函数都是对象,但不是所有东西都是对象,也不是每个对象都是函数。@JohnSonderson:你的理解是错误的。虽然所有东西都是对象,函数都是对象,但不是所有东西都是函数。@JohnSonderson是的,这是真的-任何函数都可以是构造函数。我的观点是,一个对象只有一个构造函数,而该函数对象的“prototype”属性的值决定了新对象的原型链。@JohnSonderson(还有
object.create()
,但仍然是这样,一个对象只与原型对象相关一次)。小心!!虽然说“所有由函数构造函数创建的本机ECMAScript函数都是构造函数”是正确的,它不适用于所有javascript函数,甚至不适用于所有ECMAScript函数。许多内置方法都是函数而不是构造函数(例如Array.prototype.slice),几乎所有宿主方法都是函数而不是构造函数(例如document.getElementById()).@RobG yes抱歉,这当然是真的。@Johnson Derson我要重新编辑,因为您的更改改变了我的意思。我不是在函数原型上谈论属性(可见属性)。我是在谈论内部(不可见)用于使函数实例作为函数工作的属性。该过程不涉及函数原型。