Javascript私有变量和参数具有相同的名称

时间:2017-04-05 11:51:59

标签: javascript

function() {
  var name;
  this.set = function( name ) {
    this.name = name; <-- this
  }
}

如何编写行以便将参数分配给私有变量?与Java不同,“this”也指向一个函数,所以我无法弄明白。

3 个答案:

答案 0 :(得分:2)

在函数 set 中,内部name变量将获得比外部name变量更多的偏好。为了给外部变量赋值,您必须在内部或外部使用不同的名称。 但是,您可以执行类似的操作,

function() {
  this.name = '';
  this.set = function( name ) {
    this.name = name; <-- this
  }
}

这不是将新值赋给私有变量,而是将值赋给对象的属性。

答案 1 :(得分:1)

你只需要为参数使用不同的名称,这样它就不会影响函数name之外的私有变量set,这就是全部。

var SomeClass = function() {
  var name;
  this.set = function( otherName ) { // argument should have a diffirent name so it won't shadow the other variable "name"
    name = otherName;
  }
  this.get = function() {
    return name;
  }
};

var ins = new SomeClass();
ins.set("Jim Carrey");  // OK
console.log(ins.get()); // OK
console.log(ins.name);  // undefined as expected

答案 2 :(得分:0)


2020编辑:

我碰巧回到这个问题,意识到我弄错了。 更好的代码示例。

type = function() {
    var name = "default";
    var self = this;

    this.set = function(name) {
        console.log("this: " + this);
        console.log("self: " + self);
        console.log("name: " + name);
        name = name; // <-- name shadowed
    }

    this.get = function() {
        return name;
    }
}

test = new type();
console.log("test.name: " + test.name);
console.log("test.get: " + test.get());

test.set("new")
console.log("test.name: " + test.name);
console.log("test.get: " + test.get());

我想避免通过Java可以做到的名称隐藏

this.name = name;

但是,在Javascript中,“名称”被声明为公共属性并被初始化,从而违背了这种思想锻炼的目的。 “自我”技术也不起作用(这是我错误地认为它将起作用的地方)

真正的答案是Aadit M Shah在第一个答案中的评论。

使用最近的EcmaScript(或不是最近的),Javascript可让您将getter和setter分配给属性,因此可能不需要此技术。