草庐IT

javascript - 可以在 JS 中有抽象类吗?

coder 2024-05-08 原文

我在 javascript 中遇到过原型(prototype)继承。

我想要实现的是方法的概述,当继承时必须实现/定义这些方法。

我想知道这是否可行,如果可行,如何实现。

最佳答案

JavaScript 真的没有这样的东西。正如你所说,JavaScript 是 prototype-oriented .


正如其他答案所说,当然,你可以模拟这个。但我看不出这样做的充分理由。为什么面向对象的程序员使用接口(interface)和抽象类? Astractiondecoupling .这些允许你做各种各样的好事,比如编写消耗(作为参数)和产生(返回)具有抽象类型的值的方法 - 至少满足一些关于其方法的契约的对象和字段。

反过来,我们得到了其他“好东西”,比如类型安全的编译时检查。尝试将 Foo 类型的对象传递给只接受 Bar* 类型对象的方法,您将收到编译器警告。

现在进行实际解释

  1. JavaScript 允许您将任何对象传递给任何函数。您在函数内部对该对象执行的操作可能会导致运行时错误 - 但没有什么可以阻止您传递任意参数,即使参数数量与函数声明的数量不同。
  2. JavaScript 变量没有明确的类型。当您仍然需要执行手动、显式类型检查时,“保证” 某些对象具有某些方法集有什么意义?
  3. 在 JavaScript 中,函数并不局限于从属于对象——它们是语言的一等公民,可以像对象一样使用。所以? 对象的函数可以在运行时改变。您可以向对象添加额外的函数,或从对象中删除它们(或隐藏原型(prototype)中的函数)。因此,虽然您无法在创建对象后真正更改对象的 prototypeconstructor(读作:new),但您可以更改对象的属性。
  4. 与第 2 点类似,没有办法保证函数返回什么,甚至根本无法保证函数会返回任何值。函数在 JavaScript 中不像在许多 OO 语言中那样具有显式声明的签名。

你到底想做什么?

这听起来像是您在尝试将强类型、面向对象语言的相对刚性强加到 JavaScript 的“宽松、随波逐流”的动态类型系统上。恕我直言,这不是一个好主意。也许您可以解释您要解决的实际问题?

抱歉,如果这是冗长的、咆哮的或语无伦次的。我确信至少有一种语言 ( OCaml? ) 完全颠覆了我的逻辑。给我一些反馈。


*当然,假设 Foo 不是 Bar 的子类型。

...但仅在运行时,因此它实际上并不能比您使用 JavaScript 的类型系统获得的保证更多。

因此可能

关于javascript - 可以在 JS 中有抽象类吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4082482/

有关javascript - 可以在 JS 中有抽象类吗?的更多相关文章

  1. ruby - 为什么我可以在 Ruby 中使用 Object#send 访问私有(private)/ protected 方法? - 2

    类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc

  2. ruby - 使用 Vim Rails,您可以创建一个新的迁移文件并一次性打开它吗? - 2

    使用带有Rails插件的vim,您可以创建一个迁移文件,然后一次性打开该文件吗?textmate也可以这样吗? 最佳答案 你可以使用rails.vim然后做类似的事情::Rgeneratemigratonadd_foo_to_bar插件将打开迁移生成的文件,这正是您想要的。我不能代表textmate。 关于ruby-使用VimRails,您可以创建一个新的迁移文件并一次性打开它吗?,我们在StackOverflow上找到一个类似的问题: https://sta

  3. ruby - 我可以使用 Ruby 从 CSV 中删除列吗? - 2

    查看Ruby的CSV库的文档,我非常确定这是可能且简单的。我只需要使用Ruby删除CSV文件的前三列,但我没有成功运行它。 最佳答案 csv_table=CSV.read(file_path_in,:headers=>true)csv_table.delete("header_name")csv_table.to_csv#=>ThenewCSVinstringformat检查CSV::Table文档:http://ruby-doc.org/stdlib-1.9.2/libdoc/csv/rdoc/CSV/Table.html

  4. ruby - 我可以使用 aws-sdk-ruby 在 AWS S3 上使用事务性文件删除/上传吗? - 2

    我发现ActiveRecord::Base.transaction在复杂方法中非常有效。我想知道是否可以在如下事务中从AWSS3上传/删除文件:S3Object.transactiondo#writeintofiles#raiseanexceptionend引发异常后,每个操作都应在S3上回滚。S3Object这可能吗?? 最佳答案 虽然S3API具有批量删除功能,但它不支持事务,因为每个删除操作都可以独立于其他操作成功/失败。该API不提供任何批量上传功能(通过PUT或POST),因此每个上传操作都是通过一个独立的API调用完成的

  5. ruby-on-rails - 如何在 ruby​​ 交互式 shell 中有多行? - 2

    这可能是个愚蠢的问题。但是,我是一个新手......你怎么能在交互式ruby​​shell中有多行代码?好像你只能有一条长线。按回车键运行代码。无论如何我可以在不运行代码的情况下跳到下一行吗?再次抱歉,如果这是一个愚蠢的问题。谢谢。 最佳答案 这是一个例子:2.1.2:053>a=1=>12.1.2:054>b=2=>22.1.2:055>a+b=>32.1.2:056>ifa>b#Thecode‘if..."startsthedefinitionoftheconditionalstatement.2.1.2:057?>puts"f

  6. ruby - 在 Ruby 中有条件地定义函数 - 2

    我有一些代码在几个不同的位置之一运行:作为具有调试输出的命令行工具,作为不接受任何输出的更大程序的一部分,以及在Rails环境中。有时我需要根据代码的位置对代码进行细微的更改,我意识到以下样式似乎可行:print"Testingnestedfunctionsdefined\n"CLI=trueifCLIdeftest_printprint"CommandLineVersion\n"endelsedeftest_printprint"ReleaseVersion\n"endendtest_print()这导致:TestingnestedfunctionsdefinedCommandLin

  7. ruby - 有人可以帮助解释类创建的 post_initialize 回调吗 (Sandi Metz) - 2

    我正在阅读SandiMetz的POODR,并且遇到了一个我不太了解的编码原则。这是代码:classBicycleattr_reader:size,:chain,:tire_sizedefinitialize(args={})@size=args[:size]||1@chain=args[:chain]||2@tire_size=args[:tire_size]||3post_initialize(args)endendclassMountainBike此代码将为其各自的属性输出1,2,3,4,5。我不明白的是查找方法。当一辆山地自行车被实例化时,因为它没有自己的initialize方法

  8. ruby - 是否可以覆盖 gemfile 进行本地开发? - 2

    我们的git存储库中目前有一个Gemfile。但是,有一个gem我只在我的环境中本地使用(我的团队不使用它)。为了使用它,我必须将它添加到我们的Gemfile中,但每次我checkout到我们的master/dev主分支时,由于与跟踪的gemfile冲突,我必须删除它。我想要的是类似Gemfile.local的东西,它将继承从Gemfile导入的gems,但也允许在那里导入新的gems以供使用只有我的机器。此文件将在.gitignore中被忽略。这可能吗? 最佳答案 设置BUNDLE_GEMFILE环境变量:BUNDLE_GEMFI

  9. ruby - 我可以将我的 README.textile 以正确的格式放入我的 RDoc 中吗? - 2

    我喜欢使用Textile或Markdown为我的项目编写自述文件,但是当我生成RDoc时,自述文件被解释为RDoc并且看起来非常糟糕。有没有办法让RDoc通过RedCloth或BlueCloth而不是它自己的格式化程序运行文件?它可以配置为自动检测文件后缀的格式吗?(例如README.textile通过RedCloth运行,但README.mdown通过BlueCloth运行) 最佳答案 使用YARD直接代替RDoc将允许您包含Textile或Markdown文件,只要它们的文件后缀是合理的。我经常使用类似于以下Rake任务的东西:

  10. ruby - 一个 YAML 对象可以引用另一个吗? - 2

    我想让一个yaml对象引用另一个,如下所示:intro:"Hello,dearuser."registration:$introThanksforregistering!new_message:$introYouhaveanewmessage!上面的语法只是它如何工作的一个例子(这也是它在thiscpanmodule中的工作方式。)我正在使用标准的ruby​​yaml解析器。这可能吗? 最佳答案 一些yaml对象确实引用了其他对象:irb>require'yaml'#=>trueirb>str="hello"#=>"hello"ir

随机推荐