【问题标题】:What are virtual functions in javascript?javascript中的虚函数是什么?
【发布时间】:2017-11-15 07:26:02
【问题描述】:

根据虚函数的一种定义:

在面向对象的编程中,在 C++ 等语言中,虚拟 函数或虚方法是可继承和可覆盖的函数 或促进动态调度的方法。

这将如何查找 javascript 中的函数?

【问题讨论】:

  • @bee:不是这样。该问题询问 如何 做一个虚函数,唯一的答案是“不要”,语义不同(不详述),然后对实现进行小幅改动在问题中。该答案没有解决这个问题的问题,这是欺骗标准。

标签: javascript oop virtual-functions


【解决方案1】:

这将如何查找 javascript 中的函数?

这个概念很大程度上不适用于 JavaScript。

虚函数和非虚函数(实际上是方法)的概念需要对象引用的类型概念,与对象是什么不同.例如,您可能有一个带有bar 方法的BaseFoo 类型,以及一个派生自它并覆盖barDerivedFoo 类型。稍后,如果你有一个BaseFoo 类型的变量b 引用DerivedFoo 对象,当你调用b.bar() 时,如果bar 是虚拟的,你将得到DerivedFoobar,但是BaseFoobar 如果 bar 是非虚拟的。但是如果你有一个DerivedFoo 类型的变量d 引用一个DerivedFoo 对象,那么d.bar() 总是调用bar,无论它是否是虚拟的。您用来引用对象的变量的 type 决定了如果该方法是非虚拟的,则调用哪个方法。

这些都不存在于 JavaScript 中。对对象的引用是无类型的。当您调用o.bar() 时,您会从该对象中获取属性bar 并调用它所引用的函数。

如果你想延伸一点,鉴于 JavaScript 的原型继承机制,你可以说在某种意义上,所有 JavaScript“方法”都是虚拟的,如果我们非常松散地说“方法”是附加到对象属性的函数(尽管在 ES2015+ 中,“方法”在 JavaScript 中的含义比这更具体,但仍然符合该定义)。那是因为当你在一个对象上查找一个属性时,如果它有自己的同名属性,那就是你得到的;如果它没有自己的,你只能从它的原型中得到它。但这可能有点牵强,也许太过分了。

【讨论】:

  • 啊,所以所有的 JavaScript 函数在它们可以被继承和覆盖的意义上都是虚函数,但不是在它们被定义为属于可转换类型的意义上;没有类型,因此不可能有动态调度。
  • @bitstrider:差不多,是的。对象可以说有某种类型,但引用没有(因此在comp sci 意义上没有动态调度)。
猜你喜欢
  • 2010-11-11
  • 1970-01-01
  • 1970-01-01
  • 2010-11-07
  • 2015-09-29
  • 1970-01-01
  • 2015-11-12
  • 2018-03-01
  • 1970-01-01
相关资源
最近更新 更多