关于JavaScript object.constructor属性的问题

时间:2012-07-27 18:51:16

标签: javascript constructor

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

2 个答案:

答案 0 :(得分:3)

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

  2. 似乎constructor属性已更改。通常情况下,您可能会看到类似function Array() { [native code] }而不是[ undefined ]的内容。

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

    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)

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

  2. 它按预期显示null。由于您没有得到相同的结果,因此某些第三方代码可能修改了undefined。你应该检查一下。