1
  1. 属性是否有可能为anyObject.constructornull 或未定义(尤其是当 ConstructorFunc.prototype 未修改/覆盖时)?
  2. var date = new Date(); console.log(date.constructor);// 记录“日期()”。好的。
    var data = new Array(1, 2, 3); console.log(data.constructor);// 它记录类似 [ undefined ] 的内容。它是什么以及为什么不是 Array()。

TIA

4

2 回答 2

3
  1. 是的,您可以手动覆盖.constructor构造函数prototype对象的属性。

  2. 好像constructor属性变了。通常你可能会看到类似的东西,function Array() { [native code] }而不是[ undefined ].

您可以做的一件事是验证...

console.log(typeof [].constructor);

它应该给你"function"。如果它给了你"object",那么它已经被改变了。


不要相信控制台输出

从评论看来,您正在 Firebug 中进行测试。

作为一般规则,不要过分信任控制台日志记录。控制台是环境的插件,必须解释它们被记录的内容。有时这种解释具有误导性。

如果您得到奇怪的结果,请执行其他测试...

console.log(Array);          // [ undefined ] ...huh???
console.log([].constructor); // [ undefined ] ...huh???

typeof [].constructor; // Firebug still gives "function"

[].constructor === Array; // Firebug returns true

所以你可以看到,尽管 Firebug 对函数本身给出了一个奇怪的解释,但它并没有改变它仍然是预期的Array构造函数的事实。

于 2012-07-27T18:57:40.767 回答
0
  1. constructor物业是writable。因此anyObject.constructor可以显式设置为undefinedor null(这将创建一个新属性anyObject并且不会修改 的constructor属性prototype)。您还可以更改to or的constructor属性,以便它反映在函数的每个实例上。默认情况下它永远不会是or 。prototypenullundefinednullundefined

  2. function Array() { [native code] }它按预期向我显示。由于您没有得到相同的结果,因此可能Array.prototype.constructor已被某些第三方代码修改。你应该检查一下。

于 2012-07-27T19:08:04.950 回答