像TypeScript这样的无类OOP语言如何具有静态方法?

4xrmg8kj  于 2023-06-24  发布在  TypeScript
关注(0)|答案(3)|浏览(92)

我真的很困惑。如果TypeScript转换为JavaScript,而JavaScript是一种无类语言,那么TypeScript怎么会有静态方法呢?
据我所知,这可能是错误的,在支持类的OOP语言中,静态方法是类的一部分,它不以任何方式依赖于类的特定示例。类是一段代码,一个蓝图,它包含足够的信息,以便在运行时在内存中克隆自己,静态方法从一开始就是蓝图的一部分。
JS不支持类。JS中的所有东西都是对象。所以,没有蓝图。每当我们在JS/TS中使用new关键字时,内存中的某些东西会被一次又一次地复制。所以,在这种情况下,关键字static的概念对我来说非常困惑。
如果有人能澄清这些概念,以及它们之间的关系,以及我为什么错了,我将不胜感激。

fykwrbwg

fykwrbwg1#

如果TypeScript转换为JavaScript,而JavaScript是一种无类语言,那么TypeScript怎么会有静态方法呢?
JavaScript不是无类语言。Here's the documentation on classes on JavaScript
你可能会感到困惑,因为JavaScript并不总是有类。但事实证明,你可以很容易地用基于原型的系统来模拟类系统。所以这种差异在大多数时候并不重要。即使在添加对类的官方支持之前,您仍然可以轻松地获得大多数人认为的“静态方法”。
但是所有现代JavaScript引擎都支持class关键字来支持传统的OOP样式。
在支持类的OOP语言中,静态方法是类的一部分,它不依赖于类的特定示例。
是的。
类是一段代码,一个蓝图,它包含足够的信息,以便在运行时在内存中克隆自己,静态方法从一开始就是蓝图的一部分。
它实际上根本就不是那个蓝图的一部分。它是生产蓝图的工厂的一部分。所以它属于 constructor,而不是示例。示例不能直接访问静态方法。
如果您有一个名为Person的类和一个静态方法来从数据库中查找所有人员记录,那么单个Person示例将永远不需要从数据库中查找所有人员。它属于 collection all Person s而不是任何示例的概念。
所以静态方法不是蓝图的一部分,因为它们不是示例必须处理的部分。
比你想的要简单。class是一个对象的构造函数,所有对象都有相似的接口,并以某种方式行为。该类的static成员只是属于该构造函数的值,而不属于示例。
这是一个名为findAll的静态方法:

class Person {
  static async findAll(): Promise<Person[]> { ... }
  instanceMethod() { ... }
}

const people = await Person.findAll()
new Person().instanceMethod

还有这个 * (虽然这对于可怜的TypeScript来说很难)*

function Person() {
  return this.name = 'Foo'
}
Person.prototype.instanceMethod = () => { ... }
Person.findAll = async (): Promise<Person[]> => { ... }

const people = await Person.findAll()
new Person().instanceMethod

在这两种情况下,都有一个构造函数可以生成具有示例方法的示例。构造函数也有一个静态方法。
添加static关键字后,所有的变化是,该方法在构造函数上变得可用,而在示例上不再可用。

djp7away

djp7away2#

让我们来看看在引入class和其他很酷的特性之前,static在ES5中的样子。
所以你有一些类(在ES5中,它是一个像构造函数一样接受参数的函数),例如。命名的人。
要添加静态方法,你只需要给这个类分配一些属性,所以它看起来像这样:

Person.getSpecies = function() { return 'Homo sapience' };

这就是了getSpeciesPerson类的静态方法。它是对象的独立属性。
使用ESNext语法,它看起来像是:

class Person { static getSpecies() { return 'Homo sapience' } }
q8l4jmvw

q8l4jmvw3#

跳过像JS has classes since 2015和其他东西,
JS中的所有内容都在一个对象中。

函数也是对象

所以函数可以有一些性质
一个“静态”函数是函数本身的一个属性,而不是它的prototype

function foo(){}

foo.bar = 123 // "static" property of foo
foo.prototype.asd = 999 // prototype property of foo instance

let i = new foo();
i.asd // 999
i.constructor == foo // true
i.constructor.bar // 123

相关问题