TOGOUTECH

javascript - 带有静态箭头函数的类

coder 2024-05-16 原文

我目前正在实现 static land规范(幻想世界的另一种选择)。我不仅想使用普通对象作为类型,还想使用带有静态方法的 ES2015 类。我已经将这些静态方法实现为柯里化(Currying)形式的箭头函数,而不是普通函数。然而,这对于 ES2015 类是不可能的:

class List extends Array {
  static map = f => xs => xs.map(x => f(x))
  static of = x => [x]
}

我的 map 不需要它自己的 this,因为它只是 List 构造函数上的柯里化(Currying)函数。为了让它工作,我必须编写 static map(f) { return xs => xs.map(x => f(x)) },这很烦人。

  • 为什么我不能在 ES2015 类中使用箭头函数和赋值表达式?
  • 有没有一种简洁的方法可以实现我的目标?

最佳答案

Why can't I use arrow functions along with an assignment expression in ES2015 classes?

因为那不是 ES2015 类语法的设计方式——暂时,请参阅下面的行。

Is there a concise way to achieve my goal anyway?

我不清楚你想要类,只是一个对象:

const List = {
  map: f => xs => xs.map(x => f(x)),
  of:  x => [x]
};

(您说过扩展对您所做的事情很重要。)

但如果您希望 List 扩展 Array(例如,您将拥有实例),然后向其中添加这些静态变量,则需要两步:

let List = Object.assign(
  class List extends Array { },
  {
    map: f => xs => xs.map(x => f(x)),
    of:  x => [x]
  }
);

console.log(List.of(42)); // [42]

如果您希望它们不可枚举或不可配置等,您将需要 Object.defineProperties 而不是 Object.assign;我将把它作为练习留给读者......


有一个 Stage 3 proposal对于类“字段”,包括静态字段,它正在由 JavaScript 引擎构建者积极实现。 (现在您可以通过 Babel 等工具使用它。)它在类中提供静态字段声明语法,几乎与您展示它们的方式完全相同:

// Not in the language yet, but at Stage 3 and shipping without
// any flags in V8 (for instance, in Chrome)
class List extends Array {
  static map = f => xs => xs.map(x => f(x));
  static of = x => [x];
}

console.log(List.of(42)); // [42]


注意:有一个标准的Array.of方法,因此我不会向该 List 添加不兼容的 of

最后,我要指出,除非有某种原因必须是箭头函数,否则 ES2015 的 class 语法支持静态方法:

// ES2015+
class List extends Array {
  static map(f) {
    return xs => xs.map(x => f(x));
  }
  static of(x) {
    return [x];
  }
}

console.log(List.of(42)); // [42]

关于javascript - 带有静态箭头函数的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39080040/

有关javascript - 带有静态箭头函数的类的更多相关文章

  1. c# - 一个函数可以返回两个值吗? - 2

    一个函数是否可以返回两个值?如果两个值都是同一类型,数组是可能的,但是如何返回两个不同类型的值? 最佳答案 函数可以返回2个独立的值吗?不,C#中的函数只能返回一个值。虽然可以使用其他概念返回2个值。首先想到的是使用包装类型,例如Tuple<T1,T2>.Tuple<int,string>GetValues(){returnTuple.Create(42,"foo");}Tuple<T1,T2>type仅在4.0及更高版本中可用。如果您使用的是早期版本的框架,您可以创建自己的类型或

  2. c# - C# 中的抽象类与静态类 - 2

    这个问题在这里已经有了答案:关闭11年前。PossibleDuplicate:What'sthedifferencebetweenanabstractclassandastaticone?你好我想知道C#中抽象类和静态类之间的所有区别是什么我什么时候使用什么以及为什么?抽象类真的是一个我们不能创建它的实例的类吗?谢谢

  3. C#,标志枚举,用于查找标志的通用函数 - 2

    我想要一个可以与任何Flags样式枚举一起使用的通用函数,以查看是否存在标志。这不会编译,但如果有人有建议,我将不胜感激。publicstaticBooleanIsEnumFlagPresent<T>(Tvalue,TlookingForFlag)whereT:enum{Booleanresult=((value&lookingForFlag)==lookingForFlag);returnresult;} 最佳答案 不,您不能使用C#泛型执行此操作。但是,您可以做:publicstaticboolIsEnumF

  4. c# - 如何限制c sharp中函数的执行时间? - 2

    我有一个问题。我正在编写一个基准测试,并且我有一个函数可以在2秒内或~5分钟后完成(取决于输入数据)。如果该函数执行超过3秒,我想停止该函数...我该怎么做?非常感谢! 最佳答案 嗯...,我有同样的问题,在阅读了这里的所有答案和引用的博客之后,我解决了这个问题,它让我执行有时间限制的任何代码块,声明包装器方法publicstaticboolExecuteWithTimeLimit(TimeSpantimeSpan,ActioncodeBlock){try{Tasktask=Task.Factory.StartNew(()=>

  5. c# - C#中接口(interface)、抽象类、密封类、静态类和分部类的区别? - 2

    按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭9年前。C#中接口(interface)、抽象类、密封类、静态类、分部类的区别?如果所有类都在vb.net中可用?

  6. c# - 在 finally block 中访问函数返回的值 - 2

    我想知道是否可以在finallyblock中获取函数的返回值。我有一些这样的代码。try{return1;}finally{//Getthevalue1}我知道可以通过添加一个可以保存返回值的变量来实现。但我想知道是否有可能以任何方式获得值(value)。谢谢 最佳答案 不,你不能那样做。 关于c#-在finallyblock中访问函数返回的值,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/ques

  7. c# - 函数的动态返回类型 - 2

    如何创建一个具有基于参数类型的动态返回类型的函数?喜欢protectedDynamicTypeTest(DynamicTypetype){return;} 最佳答案 你必须为此使用泛型。例如,protectedTTest<T>(Tparameter){}在此示例中,“<T>'告诉编译器它代表一个类型的名称,但您不知道在创建此函数的上下文中它是什么。所以你最终会这样调用它......intfoo;intbar=Test<int>(foo); 关于c#-函

  8. c# - 如何在 C# 中调用 protected 构造函数? - 2

    如何调用protected构造函数?publicclassFoo{publicFoo(alotofarguments){}protectedFoo(){}}varfoo=???这显然没有通过测试:publicclassFooMock:Foo{}varfoo=newFooMock();Assert(typeof(Foo),foo.GetType()); 最佳答案 调用无参数保护/私有(private)构造函数:Foofoo=(Foo)Activator.CreateInstance(typeof(Foo),true);调用带参数的非公

  9. 静态路由原理和配置 - 2

    静态路由原理和配置文章目录静态路由原理和配置一、路由原理1路由器的工作原理2.路由表的形成二、静态路由和默认路由2.1静态路由的概述2.2静态路由的特点2.3默认路由三、总结四、路由器转发数据包的封装过程五、静态路由配置命令一、路由原理路由器工作在OSI参考模型的网络层,它的重要作用是为数据包选择最佳路径,最终送达目的地在只有一个网段的网络中,数据包可以很容易地从源主机到达目的主机,但如果一台计算机要和非本网段的计算机通信,数据包可能就要经过很多路由器这就要面临一个很重要的问题——如何选择到达目的地的路径?数据

  10. 用gcc生成静态库和动态库以及静态库.a与.so库文件的生成与使用 - 2

    文章目录一、用gcc生成静态库和动态库1.编辑生成hello.h、hello.c和main.c(1).生成hello.h、hello1.c、main.c(2).生成hello.c(3)生成main.c2.将hello1.c编译成.o文件3.由.o文件创建静态库4.在程序中使用静态库5.由.o文件创建动态库文件6.在程序中使用动态库二、静态库.a与.so库文件的生成与使用(5).使用vim生成编译test.c1.静态库.a的生成与使用1.1.生成目标文件1.2.生成静态库.a文件1.3.使用.a库文件,创建可执行程序2.静态库.so库文件的生成与使用2.1.生成目标文件࿱

随机推荐

  1. c# - C# 中的质因数 - 2

    我想在C#2005中创建一个程序来计算给定输入的质因数。我想使用基本和最简单的东西,不需要为它创建一个方法,也不需要排列东西等。只是简单的模数。有什么代码可以满足我的需求吗?这是寻找简单因子的代码,我需要修改这段代码来计算素因子classProgram{staticvoidMain(string[]args){inta,b;Console.WriteLine("Pleaseenteryourinteger:");a=int.Parse(Console.ReadLine());for(b=1;b<=a;b++){if(a%b==0){Console.WriteLin

  2. c# - C#计算两年间的闰年数 - 2

    有没有更好的方法来计算两年之间的闰年数。假设我有开始日期和结束日期。我有我的代码,但我认为应该有更优雅的方式。调用代码:varnumberOfLeapYears=NumberOfLeapYears(startDate.Year+1,endDate.Year-1);函数本身:privatestaticintNumberOfLeapYears(intstartYear,intendYear){varcounter=0;for(varyear=startYear;year<=endYear;year++)counter+=DateTime.IsLeapYear(year)?1:0;re

  3. c# - .net 中的线程安全队列(列表) - 2

    我需要为要添加到lucene索引的项目创建一个线程安全列表。下面的线程安全吗?publicsealedclassIndexQueue{staticreadonlyIndexQueueinstance=newIndexQueue();privateList<string>items=newList<string>();privateIndexQueue(){}publicstaticIndexQueueInstance{get{returninstance;}}privateobjectpadlock=newobject();publicvoidAddItem(s

  4. c# - 为什么应该使用 C# 预定义类型而不是系统命名空间中的别名 - 2

    在JuvalLowy的“C#编码标准”中,可从www.idesign.net获得,建议使用C#预定义类型而不是System命名空间中的别名,例如:object不是Objectstring不是Stringint不是Int32这样做有什么好处?它们有何不同?我在自己的编码中遵循了这个建议,但不知道它们有何不同。 最佳答案 它们意外不同的主要时间是当某人愚蠢到调用类型(或属性/字段/等)String(例如)时,因为string始终指的是global::System.String,其中String可能是YourNamespace.Strin

  5. c# - GUID 转换和比较与字符串比较的成本有多高 - 2

    哪个更快?boolsame=(Guid)Identifier==id;boolsame=String.Equals(string1,string2,StringComparison.OrdinalIgnoreCase); 最佳答案 我使用了这段代码:objectvictim=Guid.Empty;Guidtarget=Guid.NewGuid();Stopwatchsw=newStopwatch();sw.Start();for(inti=0;i<10000000;i++){boolequal=((Guid)victim)==

  6. c# - 无法将 System.String 转换为 System.Uri - 2

    我正在使用Web客户端类从互联网(实际上是Flickr)下载文件。只要我使用它就可以正常工作:WebClient().DownloadData(string),但是这会锁定UI,因为它不是异步的。但是,当我尝试WebClient().DownloadDatAsync(string)时,出现编译错误:“无法将System.String转换为System.Uri”。字符串MediumUrl返回"http://farm4.static.flickr.com/2232/2232/someimage.jpg"所以问题是如何将字符串"http://farm4.static.flickr.com/2

  7. c# - 如何使用正则表达式删除括号中的文本 - 2

    我正在寻找一个将执行以下操作的正则表达式:INPUT:UserName([email protected])OUTPUT:UserName实现此目标的最佳方法是什么?使用正则表达式提取括号内的文本并替换它和任何)(字符? 最佳答案 这应该可以完成工作:varinput="UserName([email protected])";varoutput=Regex.Replace(input,@"?\(.*?\)",string.Empty);注意(和)字符的转义,这样它们就不会被识别为组标记。

  8. c# - 从 ADO.NET 确定 SQL Server 的版本 - 2

    我需要确定连接字符串连接C#控制台应用程序(.NET2.0)的SQLServer版本(在此特定情况下为2000、2005或2008)。任何人都可以提供任何指导吗?谢谢,MagicAndi更新如果可能的话,我希望能够从ADO.NET连接对象中确定SQLServer版本。 最佳答案 此代码将确定正在使用的SQLServer数据库的版本-2000、2005或2008:try{SqlConnectionsqlConnection=newSqlConnection(connectionString);Microsoft.SqlServer.M

  9. c# - 在 .net (C#) Windows 应用程序中从条码扫描仪读取数据! - 2

    关闭。这个问题需要更多focused.它目前不接受答案。想改进这个问题吗?更新问题,使其只关注一个问题editingthispost.关闭7年前。Improvethisquestion如何在.netwindows应用程序中从条码扫描仪读取数据?有人可以给出要遵循的步骤顺序吗?我对此很陌生。

  10. c# - 内存映射文件 .NET - 2

    我有一个项目,它需要访问ASP.NET中的大量专有数据。这是通过在共享内存中加载数据在Linux/PHP上完成的。我想知道尝试使用内存映射文件是否可行,或者是否有更好的方法支持更好的.NET。我正在考虑使用数据缓存,但不确定缓存中保存的数据大小的所有缺陷。 最佳答案 我知道这有点晚了,但是.NET4.0框架现在支持开箱即用的内存映射文件:http://blogs.msdn.com/salvapatuel/archive/2009/06/08/working-with-memory-mapped-files-in-net-4.aspx