【问题标题】:What is the default prototype for custom function in JavaScript?JavaScript 中自定义函数的默认原型是什么?
【发布时间】:2011-01-21 14:48:42
【问题描述】:
function f()
{
}

alert (f.prototype); // returns something like [object Object]

我的理解是默认情况下自定义函数的原型应该为null或未定义,有人可以解释一下吗?谢谢!

另见:How does __proto__ differ from constructor.prototype?

【问题讨论】:

    标签: javascript prototype


    【解决方案1】:

    【讨论】:

    • 你的意思是每次你声明一个函数Foo时,系统或者JavaScript引擎都会自动为我们创建一个Foo.prototype对象?
    • @丁:是的。这样,当您使用函数作为构造函数 (new f()) 创建对象时,您创建的对象将在其原型链中包含 Object(因为其原型的原型 对象)。小心不要将对象的原型(它“继承”的对象)与函数的 prototype 属性混淆——它们不是一回事。如果您有兴趣,请参阅 CMS 的答案以获取详细信息...
    【解决方案2】:

    它不是未定义的,因为您刚刚定义了它。仅仅因为您的 function f() 对象仍然是 empty 并不意味着它没有被定义。它只是被定义为没有内容。

    【讨论】:

      【解决方案3】:

      函数对象的prototype属性是自动创建的,只是一个具有{DontEnum}{DontDelete}属性属性的空对象,你可以在规范中查看函数对象是如何创建的:

      注意第9、10、11步:

      9) 创建一个由表达式new Object() 构造的新对象。

      10) 将 Result(9) 的构造函数属性设置为 F。该属性被赋予属性{ DontEnum }

      11) 将 F 的原型属性设置为 Result(9)。此属性具有15.3.5.2 中指定的属性。

      您可以通过以下方式看到这是真的:

      function f(){
        //...
      }
      
      f.hasOwnProperty('prototype'); // true, property exist on f
      
      f.propertyIsEnumerable('prototype'); // false, because the { DontEnum } attribute
      
      delete f.prototype; // false, because the { DontDelete } attribute
      

      【讨论】:

        猜你喜欢
        • 2021-11-06
        • 1970-01-01
        • 2020-03-08
        • 2020-08-19
        • 2017-03-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多