JavaScript函数的原型属性的初始值是多少?

时间:2010-11-01 22:38:14

标签: javascript prototype

我知道JavaScript函数对象的prototype属性被复制到使用该函数作为构造函数实例化的对象的内部[[Prototype]]属性(a.k.a。__proto__)。所以,我可以将此属性设置为我想要充当原型的任何对象:

function Foo() {}
Foo.prototype = {
  toString: function() { return "I'm a Foo!"; }
}
new Foo().toString()
// --> "I'm a Foo!"

似乎广泛的做法是将新的生成函数的现有原型的函数作为类方法添加,如下所示:

function Bar() {}
Bar.prototype.toString = function() {
  return "I'm a Bar!";
}
new Bar().toString()
// --> "I'm a Bar!"

但我不清楚prototype属性的初始值是什么。

function Baz() {}
Baz.prototype
// --> Baz {
//       constructor: function Baz() {},
//       __proto__: Object
//     }

评论显示Chrome的JavaScript控制台打印的内容。这是否意味着我创建的每个函数实际上都会创建两个对象?一个用于函数本身(constructor)和一个用于其原型?

这是在ECMAScript标准的某处定义的吗?我试图找到它但不能。所有浏览器都以同样的方式处理这个吗?

1 个答案:

答案 0 :(得分:10)

任何新创建的prototype实例上的Function的初始值是Object的新实例,但是将自己的属性constructor设置为指向新功能。

ECMA262-5在第13.2节中以典型的ECMAScript规范完全不可读的方式描述了这一点:

  

(16。)让 proto 是创建一个新对象的结果,这个对象将由表达式new Object()构造,其中Object是标准的内置构造函数那个名字

     

(17。)用参数“constructor”,属性描述符调用 proto 的[[DefineOwnProperty]]内部方法   {[[Value]]:F,{[[Writable]]:true,[[Enumerable]]:false,[[Configurable]]:true},false。

     

(18。)用参数“prototype”,属性描述符{[[Value]]:proto,{[[Writable]]调用F的[[DefineOwnProperty]]内部方法:true,[[ Enumerable]]:false,[[Configurable]]:false},false。