【问题标题】:What is the initial value of a JavaScript function's prototype property?JavaScript 函数的原型属性的初始值是多少?
【发布时间】:2010-11-01 22:38:14
【问题描述】:

我知道 JavaScript 函数对象的 prototype 属性被复制到使用该函数作为构造函数实例化的对象的内部 [[Prototype]] 属性(又名 __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 标准中的某个地方定义的吗?我试图找到它,但找不到。是否所有浏览器都以相同的方式处理这个问题?

【问题讨论】:

    标签: javascript prototype


    【解决方案1】:

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

    ECMA262-5 在 13.2 节中以典型的 ECMAScript-spec 完全不可读的方式对此进行了描述:

    (16.) 让 proto 成为创建新对象的结果,这将由表达式 new Object() 构造,其中 Object 是具有该名称的标准内置构造函数

    (17.) 调用 proto 的 [[DefineOwnProperty]] 内部方法,参数为“constructor”、Property Descriptor {[[Value]]: F, { [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: true}, 和 false。

    (18.) 调用 F 的 [[DefineOwnProperty]] 内部方法,参数为 "prototype", Property Descriptor {[[Value]]: proto, { [[Writable]]: true, [[Enumerable] ]: false、[[Configurable]]: false} 和 false。

    【讨论】:

    • 谢谢。这正是我正在寻找的答案。
    • 天啊!我时不时地深入研究 ECMAScript 规范,但这很难读。您是否知道一个资源可以逐步解释其中的所有内容(或至少解释那些可怕的部分)?
    • 遗憾的是没有。遗憾的是,ECMAScript 作为一种实际英语中的语言没有很好的参考,特别是因为它的许多功能......慷慨......有点古怪。我们有特定于供应商的指南,如 MDC、MSDN 和 Adob​​e,我们有几乎无法使用的 ECMA 规范(你确实习惯了上述语言,但在最好的时候它仍然非常繁重),除此之外,还有大量的随机教程网站,其中充满了错误和糟糕的建议。这是世界上使用最广泛的语言之一。没希望了。
    • 是的,我知道其中一些可怕的教程。所以,这里的情况和PHP tutorials的情况有点像?
    • 嘿。也许没有那么糟糕,因为大多数 JS 没有机会成为 SQL 注入的受害者(除非人们开始使用 Web SQL 数据库,无论如何......)而且并非所有教程都使用天真的@987654329 @string hacking 拖入客户端 XSS 问题。虽然我不太喜欢 jQuery,但它的使用推动了诸如从脚本绑定(而不是事件处理程序属性)和内联函数表达式之类的习惯用法,因此今天的教程至少不如 evaldocument.all-filled过去的教程。
    猜你喜欢
    • 2015-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-07
    • 2018-03-03
    • 1970-01-01
    相关资源
    最近更新 更多