我想更好地理解用函数创建的对象内部的值的机制.

let createCounter = function(init) {
    let ans = init
    return {
        increment(){return ++ans},
        decrement(){return --ans},
        reset(){return ans = init},
        ans,
    }
};
myob1=createCounter(3)
myob2=createCounter(10)
console.log(myob1.increment()) // 4
console.log(myob2.increment()) // 11
console.log(myob1.ans) // 3
console.log(myob2.ans) // 10

在创建对象后,‘ans’属性的值是否保持不变? 我能在这个语法中直接得到它的当前值吗?

据我所知,字母的值是在创建后与每个对象绑定在一起的,当我试图使用对象属性获取它的值时,它只是呼吁‘ans=init’并显示起始值? 顺便说一句,我正在学习JS,请不要生我的气:з

推荐答案

问题是,当您返回{ans}时,这等同于编写{ans: ans},其中第二个ans引用ANS的当前值.

这意味着,当您稍后将不同的值指定给ans时,对象{ans}仍引用初始值.

要解决此问题,请使用getter.将{ans}更改为{get ans() {return ans}},如下所示:

let createCounter = function(init) {
    let ans = init
    return {
        increment(){return ++ans},
        decrement(){return --ans},
        reset(){return ans = init},
        get ans() {return ans},
    }
};
myob1=createCounter(3)
myob2=createCounter(10)
console.log(myob1.increment()) // 4
console.log(myob2.increment()) // 11
console.log(myob1.ans) // 4
console.log(myob2.ans) // 11

Javascript相关问答推荐

Snowflake - .toISOString()错误地舍入JS存储过程中的时间戳

可以将SuperTest导入为ES 6模块吗?

在JavaScript中检索一些文本

获取表格的左滚动位置

React:未调用useState变量在调试器的事件处理程序中不可用

如何在Angular中插入动态组件

在nextjs服务器端api调用中传递认证凭证

如何为我的astro页面中的相同组件自动创建不同的内容?

将现场录音发送到后端

有没有可能使滑动img动画以更快的速度连续?

构造HTML表单以使用表单数据创建对象数组

如何添加绘图条形图图例单击角形事件

我的角模板订阅后不刷新'

我可以使用使用node.js创建的本地主机来存储我网站上提交的所有数据吗?没有SQL或任何数据库.只有HTML语言

当id匹配时对属性值求和并使用JavaScript返回结果

使用NextJS+MongoDB+Prisma ORM获取无效请求正文,无法发布错误

try 使用PM2在AWS ubuntu服务器上运行 node 进程时出错

第一项杀死下一项,直到数组长度在javascript中等于1

顶点图使用组标签更新列之间的条宽

AG-GRIDreact 显示布尔值而不是复选框