2010-11-01 79 views
6

我知道JavaScript函数对象的prototype属性被复制到通过使用函数作为构造函数实例化的对象的内部[[Prototype]]属性(也称为__proto__)。所以,我可以将此属性设置为任何对象,我想作为原型:JavaScript函数的原型属性的初始值是什么?

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标准的某个地方定义的吗?我试图找到它,但不能。所有浏览器都以相同的方式处理这个问题吗?

回答

10

prototype任何新创建Function实例中的初始值是Object一个新实例,但随着自有物业constructor设置为指向回新功能。

这在典型的ECMAScript规格完全不可读方式通过ECMA262-5中13.2节所描述:

(16)设是创建一个新对象的结果作为将被构造由表达式new Object()其中Object是标准内置构造具有该名称

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

+0

谢谢。那正是我正在寻找的答案。 – MForster 2010-11-01 23:13:11

+1

OMG!我时不时地进入ECMAScript规范,但这很难读。你是否知道一个能够逐步解释所有内容的资源(或者至少解释那些可怕的部分)? – 2010-11-01 23:32:33

+2

可悲的是。令人遗憾的是,ECMAScript作为一种真正的英语语言没有很好的参考,尤其是它的许多功能都是......慷慨......有点古怪。我们已经获得了像MDC,MSDN和Adobe这样的供应商特定指南,我们已经得到了ECMA规范的近乎无法使用的规范(您确实习惯了上述语言,但在最好的时候仍然非常沉重),除此之外,还有随机教程网站的排水沟充满了错误和糟糕的建议。这是世界上使用最广泛的语言之一。这是无望的。 – bobince 2010-11-02 00:23:12