功能是JavaScript中的对象吗?

时间:2015-02-05 08:29:40

标签: javascript

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

//this is a constructor function

function foo(){
    this.name="xx";
}

foo是否有一个名为 proto 的属性指向Function的原型?我怎么能看到这个属性?

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

1 个答案:

答案 0 :(得分:1)

  

是javascript中的一个对象吗?

  

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

未命名为proto,没有。这有点令人困惑:

  • 所有对象都有一个从中继承的基础原型对象。从ES5开始,您可以通过Object.getPrototypeOf获得对该对象的引用(例如,var p = Object.getPrototypeOf(blah)为您提供对blah原型的引用)。 一些引擎(包括Firefox的SpiderMonkey)也可以通过伪属性__proto__使基础原型可用,这将是in the spec as of ES6,但正式only when JavaScript is used in browsers }。

  • 单独,所有正常函数都有一个名为prototype的属性,该函数的底层原型(见上文) 。相反,它是通过new关键字将该函数用作构造函数的对象创建的基础原型。

由于这有点令人困惑,让我们画一幅画。假设我们有这个代码:

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

var f = new Foo();

(由于我将其用作构造函数,因此我使用名称Foo而不是foo来遵守约定。)

以下是我们现在的记忆:

+------------+
|  Function  |
| (function) |
+------------+       +-----------+
| __proto__  |----+->| (object)  | This is the object assigned to functions
| prototype  |----/  +-----------+ as their underyling prototype
+------------+    |  | call      |
                  |  | apply     |
                  |  | bind      |
                  |  | ...       |
                  |  +-----------+
+------------+    |
|     Foo    |    |
| (function) |    |
+------------+    |
| __proto__  |----+
|            |          +----------+
| prototype  |----+---->| (object) | This is the object assigned to
+------------+    |     +----------+ objects created via `new Foo`
                  |     | (blank)  |
                  |     +----------+
+-----------+     |
|     f     |     |
| (object)  |     |
+-----------+     |
| __proto__ |-----+
| name: 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);