除非先设置为 null,否则 Javascript 私有(private)变量不起作用

标签 javascript class private

我有一个我正在尝试制作的简单 Javascript 类,在我遇到一个似乎不应该发生的问题之前,它一直很顺利。我有以下类(class):

function circle(paper) {
        var x = null;
        var y = null;
        var r = null;

        var x1 = null;
        var y1 = null;
        var R = 0;
        this.G = 0;
        this.B = 0;
        this.lineSize = 1;

        this.paper = paper;

        var that = this;
        this.set = function(x,y,r){
            that.x = x;
            that.y = y;
            that.r = r;
        }

        this.colorOut = function(){
              console.log("R: "+that.R+" G: "+this.G+" B: "+this.B);
        }
}

那么,无论我做什么,R 都变得未定义,但是如果我执行 var R = null; 并且在 set 中我执行 that.R = 0;突然它被定义了。但是根据我在 crockford 上的发现许多 SO 帖子链接到这些问题的网站,看起来他正在做我正在做的事情并且它正在工作。如以下代码所示:

function Container(param) {

    function dec() {
        if (secret > 0) {
            secret -= 1;
            return true;
        } else {
            return false;
        }
    }

    this.member = param;
    var secret = 3;
    var that = this;

    this.service = function () {
        return dec() ? that.member : null;
    };
}

那么,这里有什么我不理解或误解的地方吗?我对 JS 中的类是如何工作的是新手,我更习惯使用 Java/C++ 类。无论如何,如果您需要更多信息,只需问!非常感谢!

最佳答案

区别很大

var R;

this.R = something;

第一个是局部变量声明。它不会向任何对象添加属性。该变量在您与对象属性相关联的任何函数中都是可见的,因为这些函数是在该构造函数中创建的。变量“R”是函数实例化时形成的闭包的一部分。

第二个在正在构建的对象上建立一个名为“R”的属性。

编辑 — 进一步说明:

    this.colorOut = function(){
          console.log("R: "+that.R+" G: "+this.G+" B: "+this.B);
    }

在该函数中,您将“R”称为构造对象的属性;这就是 that.R 的意思。当您得到的只是 var R; 声明时,对象上没有这样的属性。但是,有一个局部变量,因此您可以更改函数:

    this.colorOut = function(){
          console.log("R: " + R + " G: "+this.G+" B: "+this.B);
    }

你会看到局部变量“R”的值,不管它是什么。 (如果你不初始化它,那么它无论如何都会是 undefined。)

关于除非先设置为 null,否则 Javascript 私有(private)变量不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19843887/

相关文章:

javascript - 触发 fluffy.js

javascript - 从 javascript 强制服务器 TextChanged 事件

python - 用 Python 编写书籍类

php - 覆盖私有(private)方法时的奇怪行为

java - java 类中变量的私有(private)作用域与默认作用域 - 任何性能问题

javascript - 如何删除已使用的 JavaScript 建议数组值?

javascript - 无法绘制 Canvas

class - 静态成员上的 Groovy getProperty()

c# - 如何比较相同的属性值,而不管多个模型中的顺序或重复

javascript - 对于类实例的私有(private)成员是否有更优雅的方法?