【问题标题】:Why does Function.x work after declaring Function.prototype.x?为什么声明 Function.prototype.x 后 Function.x 起作用?
【发布时间】:2012-03-17 04:46:16
【问题描述】:

据我了解,函数的原型属性是您向从该函数实例化的所有对象添加方法/属性的方式。

所以当我尝试这样的事情时

function Person(){}
Person.prototype.saySomething = function(){ alert( "hi there" ); }

Person.saySomething();

我收到错误“Person.saySomething 不是函数”,这是有道理的,因为我没有在 Person 对象实例上执行该函数。

但是为什么运行下面的代码会起作用呢?

Function.prototype.sayHi = function(){ alert( "hi!" );}

Function.sayHi();

【问题讨论】:

  • 您可能只是将其用作示例,但值得注意的是,对原生对象进行原型设计是个坏主意。
  • 我明白了。我在一些框架中见过它,想知道它是如何工作的
  • @jbabey:什么时候是个坏主意?总是?我不得不不同意。
  • @jbabey 我完全不同意。小心使用时,这是该语言更强大的方面之一。
  • @amnotiam 你是对的,我的陈述有点过于宽泛了。这是decent article

标签: javascript prototype


【解决方案1】:

你必须先创建一个Person的实例:

new Person().saySomeThing();

原型方法/属性仅在创建构造函数实例时通过new 关键字继承。

Function.sayHi() 有效,因为Function 构造函数也是一个函数。

【讨论】:

  • 我想不出Function 示例为什么有效。很好的电话,很聪明。如果您真的想混淆,将Person 构造函数与Function 示例放在一起,Person.sayHi() 也可以...
  • 能否详细说明“函数构造函数也是函数”?我理解你关于首先实例化它的第一点,但为什么第二个没有“新”?
  • @levi 我会尽量用简单的话来解释一下:Function 可以认为是function Function() { [native code] }。由于所有函数实例 (function(){}) 都继承自 Function.prototype,因此 Function 构造函数也会受到影响。要验证Function 确实是Function 的一个实例:Function instanceof Functiontrue
猜你喜欢
  • 2016-08-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-10
  • 2017-04-06
  • 2014-07-26
  • 2015-09-30
  • 1970-01-01
相关资源
最近更新 更多