2012-07-27 48 views
1
  1. 是否有任何anyObject.constructor属性为null或未定义的可能性(尤其是当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关于JavaScript object.constructor属性的问题

+1

var data = new Array(1,2,3); console.log(data.constructor);'show me'函数Array(){[native code]}'。你在使用哪个平台?见下面[小提琴](http://jsfiddle.net/t8XVS/)。 – 2012-07-27 18:57:04

+0

嗯..是的,更混乱。如果我在萤火虫控制台中尝试相同的代码,它会记录[未定义]。 – Arjun 2012-07-27 19:02:38

+2

@Arjun:不要太依赖控制台输出。这是一种解释,容易出错和误解。 – 2012-07-27 19:08:35

回答

3
  1. 是的,你可以手动改写一个构造函数的prototype对象的.constructor财产。

  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 

所以你可以看到,即使萤火虫给函数本身的一个奇怪的解释,它不会改变的事实,它仍然是预期的Array构造函数。

0
  1. constructor财产是writable。因此anyObject.constructor可明确设置为undefinednull(这将在anyObject上创建新财产,并且不会修改prototypeconstructor财产)。您也可以将prototypeconstructor属性更改为nullundefined,以便它反映在函数的每个实例上。默认情况下,它永远不会是nullundefined

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