对于这个问题,我不希望有一个解决方案来解决问题,而是想更好地理解问题..
规范中的一些引用:
5.1版(链接)
§15.2.3.5 Object.create(O [,属性])
create 函数创建一个具有指定原型的新对象。调用 create 函数时,会执行以下步骤:
- 如果 Type(O) 不是 Object 或 Null,则抛出 TypeError 异常。
- 令 obj 为创建新对象的结果,就像通过表达式 new Object() 一样,其中 Object 是具有该名称的标准内置构造函数
- 将 obj 的 [[Prototype]] 内部属性设置为 O。
- 如果参数 Properties 存在且未定义,则向 obj 添加自己的属性,就像通过使用参数 obj 和 Properties 调用标准内置函数 Object.defineProperties 一样。
- 返回对象。
第 6 版 - 草稿 (链接)
§19.1.3.2 Object.create(O [,属性])
create 函数创建一个具有指定原型的新对象。调用 create 函数时,会执行以下步骤:
- 如果 Type(O) 不是 Object 或 Null,则抛出 TypeError 异常。
- 令 obj 为带有参数 O 的抽象操作 ObjectCreate 的结果。
- 如果参数 Properties 存在且未定义,则 a. 返回抽象操作 ObjectDefineProperties(obj, Properties) 的结果。
- 返回对象。
- 如果 Type(O) 不是 Object 或 Null,则抛出 TypeError 异常。
如果我理解正确,这两个规范都允许执行以下代码:
function F() {
}
var x=Object.create(F);
// a minimal test
alert(x.prototype.constructor===F); // true
alert(x instanceof Function) // true
alert(typeof x) // 'object'
正如我在 FireFox 中测试的那样,它似乎创建了一个派生自(对不起,术语不好..) Function
类型的对象,因此x
是不可调用的:
x(); // x is not a function
我正在考虑为什么它不允许将构造函数用作O
或仅创建有效的构造函数。
所以我想知道你希望 Object.create 对构造函数做什么?