anyObject.constructor
属性是否有可能为null或未定义(特别是未修改/覆盖ConstructorFunc.prototype时)?var date = new Date(); console.log(date.constructor);
//记录“Date()”。好的。 var data = new Array(1, 2, 3); console.log(data.constructor);
//它会记录类似[undefined]的内容。它是什么,为什么不是Array()。TIA
答案 0 :(得分:3)
是的,您可以手动覆盖构造函数的.constructor
对象的prototype
属性。
似乎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
构造函数的事实。
答案 1 :(得分:0)
constructor
属性为writable
。因此,anyObject.constructor
可以明确设置为undefined
或null
(这将在anyObject
上创建新属性,并且不会修改constructor
的{{1}}属性{1}})。您还可以将prototype
的{{1}}属性更改为constructor
或prototype
,以便它反映在该函数的每个实例上。默认情况下,它永远不会是null
或undefined
。
它按预期显示null
。由于您没有得到相同的结果,因此某些第三方代码可能修改了undefined
。你应该检查一下。