首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在JavaScript中调用名为getter的getter函数?

在JavaScript中调用名为getter的getter函数?
EN

Stack Overflow用户
提问于 2020-06-03 09:21:14
回答 3查看 199关注 0票数 2

当我像这样在JavaScript中创建一个类时:

代码语言:javascript
运行
复制
class Person {
    _firstName = "";
    _lastName = "";

    constructor(firstName, lastName) {
        this._firstName = firstName;
        this._lastName = lastName;
    }

    get firstName() {
        return this._firstName;
    }

    get lastName() {
        return this._lastName;
    }

    fullName() {
        return `${this.firstName} ${this.lastName}`;
    }

}

let me = new Person("John", "Doe");

它创建了一个变量me,它是Person的实例。它的原型有一些函数,它们的名称是“fullName”和“get firstName”(加上其他函数)。

我可以使用以下方法调用函数fullName的名称:

代码语言:javascript
运行
复制
me[“fullName”]();

John Doe

但是,用名称调用getter函数会引发一个错误:

代码语言:javascript
运行
复制
me[“get firstName”]();

Uncaught TypeError: me.get firstName is not a function

为什么会发生这种行为?

编辑:谢谢你的回复。我知道我可以而且应该把它作为一种财产来访问。但是,我想了解为什么用括号符号用它的名字访问它不起作用。这是否意味着JavaScript有不同类型的函数,因为一个函数的行为不适用于另一个函数(当它的名称中有一个空格/是一个getter或setter)?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-06-03 14:24:38

当将函数赋值给变量或属性值(可能是getter)时,涉及两个名称:

  • 函数的名称
  • 变量/属性的名称

这些名称是不同的实体,不一定是相同的。

下面是一个具有属性"a“的简单对象,其值为名称为”b“的函数:

代码语言:javascript
运行
复制
let obj = {
    a: function b() { }
};

console.log("property: ", Object.keys(obj)[0]); // "a"
console.log("function: ", obj.a.name); // "b"

现在,当函数没有显式的名称时,就给它一个名称:

代码语言:javascript
运行
复制
let obj = {
    a() { }
};

console.log("property: ", Object.keys(obj)[0]); // "a"
console.log("function: ", obj.a.name); // "a"

这可能会给人一种错误的印象,即两个名称都是一个字符串,但这不可能是正确的,因为可能将同一个函数对象分配给不同的属性:

代码语言:javascript
运行
复制
let obj = {
    a() { }
};
obj.c = obj.a;

console.log("property: ", Object.keys(obj)[1]); // "c"
console.log("function: ", obj.c.name); // "a"

吸气器

使用getter的情况可能会很混乱,因为表达式obj.a.name不会检索函数的名称,而是会调用getter,然后尝试访问返回值的name属性。

要仍然获取getter函数的名称,可以使用Object.getOwnPropertyDescriptor,如下所示:

代码语言:javascript
运行
复制
let obj = {
    get a() { }
};

console.log("property: ", Object.keys(obj)[0]); // "a"
console.log("function: ", Object.getOwnPropertyDescriptor(obj, "a").get.name); // "get a"

默认情况下,getter的函数名就是这样设置的。但是,您可以使用Object.defineProperty显式地将其设置为您的愿望,如下所示:

代码语言:javascript
运行
复制
let obj = {};
Object.defineProperty(obj, "a", { 
    get: function b() {},
    enumerable: true 
});

console.log("property: ", Object.keys(obj)[0]); // "a"
console.log("function: ", Object.getOwnPropertyDescriptor(obj, "a").get.name); // "b"

结论

  • 属性名称不一定与可能是该属性值的函数的名称匹配。
  • 属性由属性名称标识,而不是由可能与其关联的函数的名称标识。
  • 函数对象(充当getter属性)可以使用Object.getOwnPropertyDescriptor(object, propertyName).get访问。
票数 2
EN

Stack Overflow用户

发布于 2020-06-03 09:24:59

您应该将其作为普通属性访问,如下所示:

代码语言:javascript
运行
复制
me["firstName"];

但是,如果您已经知道名称,您可以访问firstName值如下所示:

代码语言:javascript
运行
复制
me.firstName

通常,如果要使用如下变量访问对象的属性,则使用第一种形式:

代码语言:javascript
运行
复制
const person = new Person("John", "Doe");
const propertyName = "firstName";
const firstName = person[propertyName];

如果您想了解更多关于getter和getter的信息,请查看https://javascript.info/property-accessorshttps://javascript.info/property-accessors

下面是一个充分发挥作用的例子:

代码语言:javascript
运行
复制
class Person {
    _firstName = "";
    _lastName = "";

    constructor(firstName, lastName) {
        this._firstName = firstName;
        this._lastName = lastName;
    }

    get firstName() {
        return this._firstName;
    }

    get lastName() {
        return this._lastName;
    }

    fullName() {
        return `${this.firstName} ${this.lastName}`;
    }

}

const me = new Person("John", "Doe");
const propertyName = "firstName";
console.log(me["firstName"])
console.log(me.firstName)
console.log(me[propertyName])

票数 1
EN

Stack Overflow用户

发布于 2020-06-03 09:46:20

当这样做时:

代码语言:javascript
运行
复制
get firstName() {
    return this._firstName;
}

它定义了一个属性,而你必须调用它:

代码语言:javascript
运行
复制
me.firstName;

这样做:

代码语言:javascript
运行
复制
getFirstName() {
    return this._firstName;
}

实际上定义了getter函数,您可以这样称呼它:

代码语言:javascript
运行
复制
me.getFirstName();

也许这是有帮助的:https://developer.mozilla.org/de/docs/Web/JavaScript/Reference/Functions/get

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62169309

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档