是JavaScript中的函数一个对象

is function an object in JavaScript?

本文关键字:函数 一个对象 JavaScript      更新时间:2023-09-26

函数是JavaScript中的"function"对象吗?如果是这样,当我创建一个构造函数时,比如:

//this is a constructor function
function foo(){
    this.name="xx";
}

foo是否有一个名为proto的属性指向函数的原型?我怎样才能看到这处房产?

ps:如果proto是在通过new关键字创建实例时创建的,为什么function foo没有它?如上所述,foo是通过new Function创建的。

函数是javascript中的对象吗?

是的。

foo是否有一个名为proto的属性指向函数的原型?

没有命名为proto,没有。这是一个有点令人困惑的领域:

  • 所有对象都有一个从中继承的底层原型对象。从ES5开始,您可以通过Object.getPrototypeOf获得对该对象的引用(例如,var p = Object.getPrototypeOf(blah)为您提供对blah的原型的引用)一些引擎(包括Firefox的SpiderMonkey)也通过伪属性__proto__提供了底层原型,这将在ES6的规范中,但只有在浏览器中使用JavaScript时才正式提供。

  • 另外,所有正常函数都有一个名为prototype的属性,这是而不是该函数的原型(见上文)。相反,该对象将被分配为创建的对象的底层原型,该对象使用该函数作为通过new关键字创建的构造函数。

既然这有点令人困惑,我们就来画一幅画吧。假设我们有这样的代码:

function Foo() {
    this.name = "xx";
}
var f = new Foo();

(由于我使用它作为构造函数,所以我使用了名称Foo而不是foo来遵守惯例。)

以下是我们现在记忆中的内容:

+------------+|功能||(功能)|+------------++-----------+|__proto__|----+->|(对象)|这是分配给函数的对象|原型|----/+----------------+作为他们的原型+------------+||呼叫|||应用|||绑定|||||+-----------++------------+||Foo|||(函数)||+------------+||__原型__|----+||+----------+|prototype |----+---->|(object)|这是分配给的对象+------------+|+----------+通过`new Foo创建的对象`||(空白)||+----------++-----------+||f|||(对象)||+-----------+||__原型__|-----+|姓名:xx|+-----------+

(为了简化起见,我省略了上面对Object.property的引用。)

我怎样才能看到这处房产。

如上所述,__proto__(目前仅在某些发动机上,将是ES6中的标准配置)或通过Object.getPrototypeOf(ES5)。

示例:

// Shows you the object referenced by Function.prototype,
// which is `foo`'s underyling prototype
// ONLY WORKS ON SOME ENGINES for now (including Firefox's SpiderMonkey)
console.log(foo.__proto__);
// Shows you the object referenced by foo.prototype
console.log(foo.prototype);

相关文章: