Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >链式函数变成了单例函数。如何预防

链式函数变成了单例函数。如何预防
EN

Stack Overflow用户
提问于 2021-02-23 23:14:12
回答 1查看 90关注 0票数 0

请注意:这是我即将提出的问题的超级简化版本.写完这个问题后,我决定把它分成几个问题。

我正在尝试实现一个可链接的函数。什么是预期的输出目前并不重要,但是做的是我试图提供的API。

首先,我试图实现一个可以与自身链接的函数。让我们考虑一个函数,它接受颜色作为字符串并通过调用方法log()输出它。但是,如果我们在自己上调用这个函数(链式),它现在应该输出2颜色。如果我们将它链接3次-- log()方法应该输出3种颜色,例如…

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function getColor(color: string) {
    if (getColor.prototype.color) {
        getColor.prototype.color = getColor.prototype.color + " " + color
    } else {
        getColor.prototype.color = color
    }


    return {
        log: () => {
            console.log(getColor.prototype.color)
        },
        getColor: (color: string) => {
            return getColor.call(getColor, color)
        }
    }
}

getColor('red').getColor('blue').getColor('green').log() // Must be "red blue green"

getColor('yellow').log() // Must be "yellow"

我决定要做的是将颜色存储在原型中,然后检查它是否存在。如果我们已经有颜色,那么我们就给它添加一个新的颜色。然而,由于它,我的功能变成了独生子女。我真的不明白我是如何做到这一点的,但是getColor.prototype.color被从一个调用传递到另一个…

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
getColor('red').getColor('blue').getColor('green').log() // "red blue green" - GOOD!
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
getColor('yellow').log() // "red blue green yellow" - WAT?

据我所知-如果我修改了原语一次,那么它仍然是修改的。

我想要实现的是能够将功能与自身联系起来。

只有当我从它本身调用函数时,颜色才会被叠加。因此,从根本上说,某些逻辑只在getColor().getColor情况下触发,而在getColor()中不触发。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-02-24 01:01:45

首先,我正在尝试实现一个可以与其自身链接的函数。

让我们翻译一下:您正在尝试编写一个函数,该函数返回一个具有函数(“方法”)的对象实例,该函数再次返回一个对象实例etc.pp。

创建对象实例的函数通常称为工厂函数。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function getColor(color) {
    return new Color(color);
}

现在,Color实例可以有一个方法,如add(),它向当前颜色添加新颜色。对于一个流畅的接口(或“链接”),这再次需要返回一个对象实例。现在,让我们返回相同的对象。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function Color(color) {
    this.color = color;
    this.add = function (color) {
       this.color += ' ' + color;
       return this;
    }
}

现在你可以:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
getColor('red').add('green').add('blue');    // => now contains 'red green blue';
new Color('red').add('green').add('blue');   // => same thing

如果不想改变Color实例,请将.add()转换为另一个工厂:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function Color(color) {
    this.color = color;
    this.add = function (color) {
       return new Color(this.color + ' ' + color);
    }
}

用法不变。

只有当我从它本身调用函数时,颜色才应该被堆叠。

我避免将独立工厂getColor()称为类内部工厂.add(),因为它们所做的事情不同。但.add()已经满足了这一要求。

为了避免在每个类实例上都有一个单独的.add(),让我们将它移到原型中。让我们还包括一个fluent .log()方法,并作为一个变体,包含一个类方法.get(),它取代了getColor()工厂的独立功能:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function Color(color) {
    this.color = color;
}
Color.prototype.add = function (color) {
    return new Color(this.color + ' ' + color);
};
Color.prototype.log = function () {
    console.log(this.color);
    return this;
};
Color.get = function (color) {
    return new Color(color);
};

用法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Color.get('red').log().add('green').log().add('blue').log();
new Color('red').log().add('green').log().add('blue').log();

如果您更喜欢ES6类的语法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Color {
    constructor (color) {
        this.color = color;
    }
    add (color) {
        return new Color(this.color + ' ' + color);
    }
    log () {
        console.log(this.color);
        return this;
    }
    static get(color) {
        return new Color(color);
    }
}

TypeScript类型与手头的问题没有任何关系,所以我忽略了它们。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66346249

复制
相关文章
完美解决PHP使用curl返回空白
最新的curl认可证书:https://curl.haxx.se/ca/cacert.pem
房东的狗丶
2023/02/17
3.4K0
从列表中或数组中随机抽取固定数量的元素组成新的数组或列表
2:jQuery版本 那么jQuery中怎么随机选出固定数组数组[1, 2, 3, 4, 5, 6, 7, 8, 9]中的三个元素,并构造成新数组的?
王小婷
2018/08/02
6.1K0
Android列表组件ListView使用详解之动态加载或修改列表数据
在使用ListView组件来显示列表数据时,有的时候我们需要改变列表中的数据,有以下方法:
PHP开发工程师
2021/06/09
1.3K0
3-4 文件读写例子(4)
/*******************************************************
py3study
2020/01/14
3620
迷途知返的滴滴
从美股退市,对于滴滴来讲,或许是再适合不过的事情了。对于滴滴来讲,这更像是一次迷途知返。在中概股回港上市的大潮流里,纵然是滴滴不再这样一个时间档口选择从美股退市,在未来的某一个时间点上,滴滴还是要选择从美股退市的。所以,滴滴选择在这样一个时刻从美股退市,更多地是在做未来必然要做的事情。
孟永辉
2022/05/25
3190
迷途知返的滴滴
Django Model 如何返回空的 QuerySet
>>> from django.contrib.auth.models import User >>> User.objects.none() <QuerySet []> 以上就是本文的全部内容,如果觉得还不错的话。
AlwaysBeta
2022/05/05
7640
【解决】librosa.load MP3返回空 或 报错Input signal length=0 is too small to resample from
        用pydub.utils.mediainfo()去分析,可以发现,它对音频start_time=0的音频都会报这个错,而start_time != 0的就可以正确加载。
小锋学长生活大爆炸
2023/03/01
9760
【解决】librosa.load MP3返回空 或 报错Input signal length=0 is too small to resample from
python中星号的意义(**字典,*列表或元组)
传递实参和定义形参(所谓实参就是调用函数时传入的参数,形参则是定义函数是定义的参数)的时候,你还可以使用两个特殊的语法:*、** 。 调用函数时使用* ,** test(*args)中 * 的作用:其实就是把序列 args 中的每个元素,当作位置参数传进去。比如上面这个代码,如果 args 等于 (1,2,3) ,那么这个代码就等价于 test(1, 2, 3) 。 test(**kwargs)中** 的作用:则是把字典 kwargs 变成关键字参数传递。比如上面这个代码,如果 kwargs 等于 {
用户1214487
2018/01/24
3.7K0
文件方法
C# 获取指定目录下所有文件信息、移动目录、拷贝目录 /// <summary> /// 获取目录下的所有文件夹和文件的path /// </summary> /// <param name="path"></param> /// <returns></returns> public static List<string> getPath(string path) { Directory
用户1055830
2018/01/18
6600
访问权限导致toString返回空BUG分享
这个BUG偶然间发现的,因为之前一直都是用Groovy去写脚本(Groovy默认访问权限是public)。在某一个使用Java写脚本的时候突然发现,我将创建好的对象toString之后竟然是空的,无论是打印对象属性还是非空验证都是通过的。但是通过fastjson的toString方法之后就变成了空。
FunTester
2020/10/19
4410
win10 uwp 解决 SerialDevice.FromIdAsync 返回空
调用 SerialDevice.FromIdAsync 可能返回空,因为没有设置 package.appmanifest 可以使用端口
林德熙
2019/03/13
6330
tp自动验证流程和返回空数组的问题
今天下午上班做配置表数据自动验证更新时,发现验证失败返回false,而验证成功返回的却只是空数组,导致一直判断为false;
仙士可
2019/12/18
9940
Python 中如何向列表或数组添加元素
然而,与其它编程语言不同,数组在 Python 中不是一个内置的数据结构。Python 使用列表取代传统的数组。
Python学习者
2023/09/11
4180
实现列表瀑布流布局(纯css或js定位)
前言:最近项目好几个都怼到一起,导致好久没有更新了。这里就简单记录下这段时间常常要写的瀑布流列表 纯css实现: 直接上代码 <style lang="scss"> .post-list{/* 列表设置,2列;列间距4*/ -webkit-column-count: 2; -webkit-column-gap:16upx; padding: 30upx 16upx; .post-li{ -webkit-col
stys35
2020/06/28
2.1K0
Oracle启动失败startup – 闪回空间满
失败,ORA-03113: end-of-file on communication channel 查看日志: SQL> show parameter db_recovery_file_dest_size;
星哥玩云
2022/08/18
7050
11 - 去掉列表或元组中的重复元素
在python 中如何定义集合,集合与列表有什么区别 # 列表 a = [1, 2, 3, 4, 5] print(type(a)) # 元组 b = (1, 2, 3, 4, 5) print(type(b)) # 集合 c = {1, 2, 3, 4, 5} print(type(c)) <class 'list'> <class 'tuple'> <class 'set'> # 区别: # 1. 集合没有重复的元素,而列表可以有重复的元素 a = [1, 2, 2, 3, 4] print(a)
ruochen
2021/05/22
3.6K0
11 - 去掉列表或元组中的重复元素
CreateWindow返回空句柄而GetLastError返回0咋回事
调用CreateWindow或CreateWindowEx创建窗口返回空句柄时,我们总是会调用GetLastError看下错误码,就知道具体错误的原因(比如窗口类未注册),但如果GetLastError返回0没有报错,是怎么回事呢?
gaigai
2019/08/30
2.3K0
CPS推荐奖励历史返佣规则
2025年3月18日起,沉睡用户定义由“180天内无保有消费记录”变更为“30天内无保有消费记录”。
腾讯云-推广奖励
2022/05/24
7.5K0
Audio Unit录音(播放伴奏+耳返)
前言 相关文章: 使用VideoToolbox硬编码H.264 使用VideoToolbox硬解码H.264 使用AudioToolbox编码AAC 使用AudioToolbox播放AAC
落影
2018/04/27
3.1K0
Audio Unit录音(播放伴奏+耳返)
点击加载更多

相似问题

蓝鸟图早返

21

Mongoose填充返回空数组或ObjectIds列表

21

DirectoryInfo.getFiles以开头

36

Sqlalchemy返标

13

从Directory.GetFiles填充二维列表

16
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文