JavaScript函数的初始值是多少;什么是原型财产?

JavaScript函数的初始值是多少;什么是原型财产?,javascript,prototype,Javascript,Prototype,我知道JavaScript函数对象的prototype属性被复制到通过使用函数作为构造函数实例化的对象的内部[[prototype]]属性(也称为\uuuuuu proto\uuu)。因此,我可以将此属性设置为任何要用作原型的对象: function Foo() {} Foo.prototype = { toString: function() { return "I'm a Foo!"; } } new Foo().toString() // --> "I'm a Foo!" 在新

我知道JavaScript函数对象的
prototype
属性被复制到通过使用函数作为构造函数实例化的对象的内部
[[prototype]]
属性(也称为
\uuuuuu proto\uuu
)。因此,我可以将此属性设置为任何要用作原型的对象:

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控制台打印的内容。这是否意味着我创建的每个函数实际上都创建了两个对象?一个用于函数本身(构造函数),一个用于其原型


这是ECMAScript标准中定义的吗?我试图找到它,但找不到。所有浏览器都以相同的方式处理此问题吗?

任何新创建的
函数
实例上的
原型
的初始值是
对象
的新实例,但其自身属性
构造函数
设置为指向新函数

ECMA262-5在第13.2节“完全不可读的典型ECMAScript规范”中对此进行了描述:

(16.)假设proto是创建一个新对象的结果,该对象将由表达式
newobject()
构造,其中
object
是具有该名称的标准内置构造函数

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

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


谢谢。这正是我想要的答案。OMG!我时不时地深入研究ECMAScript规范,但这几乎不可读。你知道一个逐步解释其中所有内容的资源吗(或者至少解释那些可怕的部分)?遗憾的是,没有。很遗憾,ECMAScript作为一种语言在实际英语中没有很好的参考资料,特别是它的许多功能……慷慨地说……有点古怪。我们有特定于供应商的指南,如MDC、MSDN和Adobe,我们有几乎无法使用的ECMA规范(你确实有点习惯了上面的语言,但即使在最好的时候,它仍然非常沉重),除此之外,还有充斥着错误和糟糕建议的随机教程网站。对于世界上使用最广泛的语言之一来说,这是毫无希望的。是的,我知道一些糟糕的教程。所以,这里的情况和我们的情况一样?呵呵。也许没那么糟糕,因为大多数JS没有op有机会成为SQL注入的牺牲品(除非人们开始使用Web SQL数据库,无论如何…),而且并非所有教程都使用天真的
innerHTML
string hacking来拖拽客户端XSS问题。虽然我并不真的喜欢jQuery,但它的使用已经从脚本中推出了绑定等习惯用法(而不是事件处理程序属性)和内联函数表达式,因此今天的教程至少没有
eval
文档那么糟糕。