如何在JavaScript中“获取”成员变量?

3
function User() {
    this.firstname = null;

    get getFirst() {
        return this.firstname;
    }
}

JavaScript控制台在第12行显示“意外标识符”错误。
var Jake = new User();
Jake.firstname = "Jake";
document.write(Jake.getFirst);

2
我从未在JavaScript中看到过get关键字。你有编写ActionScript的经验吗? - NoImaginationGuy
这是一个getter,你可以在这里阅读更多信息:https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Functions/get 你确定你正在尝试使用它们的环境中实现了这些getter吗? - Dimkin
1
@osnapitzkindle:自2009年以来,JavaScript就拥有了一个有效的“get”关键字。 - T.J. Crowder
抱歉,我从未使用过它。顺便说一下,既然我们正在谈论“Java”脚本,也许Java编码风格更好。 - NoImaginationGuy
3个回答

9
这只不过不是定义getter函数的语法。您需要在对象字面量中使用它,像这样:
var foo = {
    get bar() {
        return 42;
    }
};

foo.bar; // 42

......但是这并不是你的get所在的位置。

如果要在你的get所在的位置定义它,则可以使用defineProperty

function User() {
    this.firstname = null;

    Object.defineProperty(this, "first", {
        get: function() {
            return this.firstname;
        }
    });
}

注意我称它为first而不是getFirst,因为它是一个访问器函数,看起来像直接属性访问,因此通常不用动词形式命名:

var u = new User();
u.firstname = "Paul";
u.first; // "Paul"

如果你想创建一个名为getFirst的函数,只需去掉get关键字:

this.getFirst = function() {
    return firstname;
};
// ...
var u = new User();
u.firstname = "Paul";
u.getFirst(); // "Paul"

2
Object.defineProperty() 中,你可以写 get 而不是 value,它会按预期工作。然而,使用这段代码仍将返回 null,因为 firstname 实际上并没有被设置为 "Paul" - Sebastian Simon
@Xufox:哈哈,说得好。还有感谢你指出value/get的问题。 - T.J. Crowder

2
我认为问题在于你使用了函数而不是对象字面量,这与文档中所述的get方法不一致。请参考文档
var User = {
   firstName: 'Darren',
   get getFirst() { return this.firstName; }
}

alert(User.getFirst);

https://jsfiddle.net/ecao51n0/


0

get 应该在对象内部调用,而不是函数构造器中调用。如果你想将 getFirst 声明为 User 上的一个函数,那么可以这样做:

function User() {
   this.firstname = null;
   this.getFirst = function() {
      return this.firstname;
   }
}

然后你还需要将 getFirst 作为函数进行调用:

var Jake = new User();

Jake.firstname = "Jake";

document.write(Jake.getFirst());

但是这个问题是关于如何将它作为getter工作,而不是作为函数。 - Sebastian Simon
“Getter”只是一个返回值的函数。 - Anthony E

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接