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

MFo*_*ter 6 javascript prototype

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

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

看起来普遍的做法是添加应该作为类方法的函数来处理新生成的函数的现有原型,如下所示:

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

但是,我不清楚该物业的初始价值是多少prototype.

function Baz() {}
Baz.prototype
// --> Baz {
//       constructor: function Baz() {},
//       __proto__: Object
//     }
Run Code Online (Sandbox Code Playgroud)

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

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

bob*_*nce 10

prototype任何新创建的Function实例的初始值都是一个新实例Object,但constructor设置了own-property 以指向新函数.

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"调用F的[[DefineOwnProperty]]内部方法,属性描述符{[[Value]]:proto,{[[Writable]]:true,[[Enumerable]]:false,[[可配置]]:false}和false.

  • 可悲的是没有.令人遗憾的是,ECMAScript作为实际英语中的一种语言没有很好的参考,特别是因为它的许多功能......慷慨......有点古怪.我们有像MDC,MSDN和Adobe这样的特定于供应商的指南,我们已经获得了几乎无法使用的ECMA规范(你可以习惯上述语言,但它在最好的时候仍然很重要),除此之外,随机教程网站的阴沟充满了错误和糟糕的建议.这是世界上使用最广泛的语言之一.这是没有希望的. (2认同)