使用 Javascript 时如何更新保持关闭状态的值?

Posted

技术标签:

【中文标题】使用 Javascript 时如何更新保持关闭状态的值?【英文标题】:How do I update the value remains in closure when using Javascript? 【发布时间】:2017-07-28 14:04:20 【问题描述】:

这可能是一个非常基本的问题,但我对 javascript 还很陌生,我什至不知道应该搜索哪个关键字才能找到它。如果这个问题已经被问过,我很抱歉,请让我知道它是哪个问题。

我已经读过 getter 和 setter 不能在原型中声明,所以我尝试测试如果我在原型中声明 getter 和 setter 会发生什么。但我遇到了另一个问题。

这是一个简单的代码,它声明了一个构造函数以使对象成为“矩形”,它包括 getter 和 setter。

但是当我运行这段代码时,运行 getArea() 会得到“35”,尽管我使用 setWidth() 将宽度的值更改为 10;我检查了控制台上的宽度值,但它说您的宽度已更改为 10。

所以我猜这是关于闭包的事情,getArea() 在声明时加载宽度和高度,并且它没有更新为我设置的值。

1) 当我通过 setter 更改高度和宽度的值时,如何更新 getArea() 中的值? (如何使用更新值的函数计算面积?当然我还是想封装它。所以宽度和高度不会是this.width和this.height)

2) 如果我对关闭的直觉是错误的,为什么 getArea() 总是在我脸上吐出 35?

3)我想先尝试什么,为什么我不能在原型中声明getter和setter?

function Rectangle(w, h) 
var width = w;
var height = h;

this.getWidth = function() 
    return w;
;
this.getHeight = function() 
    return h;
;
this.setWidth = function(w) 
    if (w < 0) 
        throw 'width cannot be under 0';
     else 
        console.log('width = w');
        width = w;
        console.log('I put : ' + w);
        console.log('width = ' + width);
    
;

this.setHeight = function(h) 
    if (h < 0) 
        throw 'height cannot be under 0';
     else 
        console.log('height = h');
        height = h;
    
;

Rectangle.prototype.getArea = function() 
    return this.getWidth() * this.getHeight();
;

var rectangle = new Rectangle(5, 7);
rectangle.setWidth(10);

alert('AREA : ' + rectangle.getArea());

【问题讨论】:

【参考方案1】:

您必须返回 'Width' 而不是 'w'。在这里我已经改变了你的代码检查这个,

       this.getWidth = function () 
            return width;
        ;
        this.getHeight = function () 
            return height;
        ;

  function Rectangle(w, h) 
            var width = w;
            var height = h;

            this.getWidth = function () 
                return width;
            ;
            this.getHeight = function () 
                return height;
            ;
            this.setWidth = function (w) 
                if (w < 0) 
                    throw 'width cannot be under 0';
                 else 
                    console.log('width = w');
                    width = w;
                    console.log('I put : ' + w);
                    console.log('width = ' + width);
                
            ;

            this.setHeight = function (h) 
                if (h < 0) 
                    throw 'height cannot be under 0';
                 else 
                    console.log('height = h');
                    height = h;
                
            ;
        
        Rectangle.prototype.getArea = function () 
            return this.getWidth() * this.getHeight();
        ;

        var rectangle = new Rectangle(5, 7);
        rectangle.setWidth(10);

        alert('AREA : ' + rectangle.getArea());

【讨论】:

【参考方案2】:

您的 getter 将返回您传入的 wh,而不是本地闭包的 widthheight 变量。然后,您在 setter 中设置 widthheight,但原来的 wh 保持其初始值,并在您的 getter 中按原样返回。

如果您希望它们返回您在 setter 中使用的更新值,请尝试更新您的两个 getter 函数以返回您的 widthheight

this.getWidth = function() 
  return width;
;
this.getHeight = function() 
  return height ;
;

【讨论】:

...!我应该让我的 Javascript 书的作者知道他的书印错了。更改吸气剂后,一切正常。谢谢! @HyeonWoo 很高兴为您提供帮助。如果这能解决您的问题,请不要忘记标记为已回答! 抱歉,我在哪里可以找到标记为已回答的按钮?我是新来的 @HyeonWoo 欢迎您!每个答案响应的侧面都有赞成/反对箭头按钮,其当前的数字分数介于两者之间。当这是您的问题时,同一区域也会有一个复选标记。这就是您要单击以标记您的问题已回答以及响应的内容。您可以对系统中的任何答案投赞成票或反对票,但只能在您自己的问题上打勾。

以上是关于使用 Javascript 时如何更新保持关闭状态的值?的主要内容,如果未能解决你的问题,请参考以下文章

页面刷新JavaScript,Spring Boot时如何保持复选框处于选中状态?

如何在可可中保持应用程序状态

关闭 SSH 时保持 Django 运行服务器处于活动状态

选择后如何关闭汉堡菜单? javascript

单击退出后应用程序保持打开状态?怎么了?

更改其他数据时如何保持日期不变?