我真的很困惑。如果TypeScript转换为JavaScript,而JavaScript是一种无类语言,那么TypeScript怎么会有静态方法呢?
据我所知,这可能是错误的,在支持类的OOP语言中,静态方法是类的一部分,它不以任何方式依赖于类的特定示例。类是一段代码,一个蓝图,它包含足够的信息,以便在运行时在内存中克隆自己,静态方法从一开始就是蓝图的一部分。
JS不支持类。JS中的所有东西都是对象。所以,没有蓝图。每当我们在JS/TS中使用new关键字时,内存中的某些东西会被一次又一次地复制。所以,在这种情况下,关键字static的概念对我来说非常困惑。
如果有人能澄清这些概念,以及它们之间的关系,以及我为什么错了,我将不胜感激。
3条答案
按热度按时间fykwrbwg1#
如果TypeScript转换为JavaScript,而JavaScript是一种无类语言,那么TypeScript怎么会有静态方法呢?
JavaScript不是无类语言。Here's the documentation on classes on JavaScript
你可能会感到困惑,因为JavaScript并不总是有类。但事实证明,你可以很容易地用基于原型的系统来模拟类系统。所以这种差异在大多数时候并不重要。即使在添加对类的官方支持之前,您仍然可以轻松地获得大多数人认为的“静态方法”。
但是所有现代JavaScript引擎都支持
class
关键字来支持传统的OOP
样式。在支持类的OOP语言中,静态方法是类的一部分,它不依赖于类的特定示例。
是的。
类是一段代码,一个蓝图,它包含足够的信息,以便在运行时在内存中克隆自己,静态方法从一开始就是蓝图的一部分。
它实际上根本就不是那个蓝图的一部分。它是生产蓝图的工厂的一部分。所以它属于 constructor,而不是示例。示例不能直接访问静态方法。
如果您有一个名为
Person
的类和一个静态方法来从数据库中查找所有人员记录,那么单个Person
示例将永远不需要从数据库中查找所有人员。它属于 collection allPerson
s而不是任何示例的概念。所以静态方法不是蓝图的一部分,因为它们不是示例必须处理的部分。
比你想的要简单。
class
是一个对象的构造函数,所有对象都有相似的接口,并以某种方式行为。该类的static
成员只是属于该构造函数的值,而不属于示例。这是一个名为
findAll
的静态方法:还有这个 * (虽然这对于可怜的TypeScript来说很难)*
在这两种情况下,都有一个构造函数可以生成具有示例方法的示例。构造函数也有一个静态方法。
添加
static
关键字后,所有的变化是,该方法在构造函数上变得可用,而在示例上不再可用。djp7away2#
让我们来看看在引入class和其他很酷的特性之前,
static
在ES5中的样子。所以你有一些类(在ES5中,它是一个像构造函数一样接受参数的函数),例如。命名的人。
要添加静态方法,你只需要给这个类分配一些属性,所以它看起来像这样:
这就是了
getSpecies
是Person
类的静态方法。它是对象的独立属性。使用ESNext语法,它看起来像是:
q8l4jmvw3#
跳过像
JS has classes since 2015
和其他东西,JS中的所有内容都在一个对象中。
函数也是对象
所以函数可以有一些性质
一个“静态”函数是函数本身的一个属性,而不是它的
prototype