Javascript变量 - Getter问题

dar*_*ong 1 javascript variables getter private

我想出了下面的情况:

function Dog () {
    "use strict";
    this.age = 1;
    var name = "Fido";
    this.getName = function () { return name; }
}
Run Code Online (Sandbox Code Playgroud)

现在我正在创建一个"Dog"类的新实例并打印变量的值.

var d = new Dog;
document.write('<strong>Dog age:</strong> ' +d.age); \\Outputs "1" as expected
document.write('<br/>');
document.write('<strong>Dog name:</strong> ' +d.name); \\Outputs "undefined" as expected, 'cause it's a private variable.
document.write('<br/>');
document.write('<strong>Get Dog name:</strong> ' +d.getName()); \\Outputs "Fido", as expected.
Run Code Online (Sandbox Code Playgroud)

但是,假设我想改变Dog的名字,如下所示:

d.name = "Stinky";
document.write('<br/>');
document.write('<strong>Dog name Again:</strong> ' +d.name); 
document.write('<br/>');
document.write('<strong>Get Dog name Again:</strong> ' +d.getName());
Run Code Online (Sandbox Code Playgroud)

基于此,我提出了几个问题:

  1. 为什么在地球上"d.name"没有向我显示"未定义"?"名称"不是私有变量吗?我想你不能改变私有变量值,对吗?我想知道这个过程是否创建了一个新变量,但这次是一个公共变量,并且具有相同的名称.如果是这样,每次我尝试分配一个具有相同名称的新属性时,是否有办法阻止创建新变量?有没有办法抛出"类型错误"或其他东西(嗯,这是我的预期).
  2. 最后:为什么"getName"打印出原始值"Fido",即使我为其分配了新值?

有任何想法吗?

这是一个让事情变得简单的fid.

http://fiddle.jshell.net/yZpfg/2/

jba*_*bey 6

d.name = "Stinky";正在向d对象添加一个新的(公共)属性,这是一个instanceOf Dog.

getter仍然使用值引用(private)变量Fido.

如果您想允许消费者更改私有变量,您还需要一个setter:

function Dog () {
    "use strict";
    this.age = 1;
    var name = "Fido";
    this.getName = function () { return name; }
    this.setName = function (value) { name = value; }
}

var d = new Dog(); 
d.name; // undefined because there is no name public property
d.getName() // returns the internal private, "Fido"
d.setName('Stinky'); // the internal private is now "Stinky"
Run Code Online (Sandbox Code Playgroud)

  • 为了清楚(如果"狗对象"令人困惑),它正在向`d`对象(`狗`的实例)添加一个新属性.它并没有为`Dog`本身添加新属性. (2认同)