JavaScript中的函数是'Function'对象吗?如果是这样,当我创建一个构造函数时,如:
//this is a constructor function
function foo(){
this.name="xx";
}
foo是否有一个名为 proto 的属性指向Function的原型?我怎么能看到这个属性?
ps:如果在通过new
关键字创建实例时创建了 proto ,为什么function foo
没有呢?根据上述内容,foo
是通过new Function
创建的。
答案 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);