当我像这样在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的名称:
me[“fullName”]();
John Doe
但是,用名称调用getter函数会引发一个错误:
me[“get firstName”]();
Uncaught TypeError: me.get firstName is not a function
为什么会发生这种行为?
编辑:谢谢你的回复。我知道我可以而且应该把它作为一种财产来访问。但是,我想了解为什么用括号符号用它的名字访问它不起作用。这是否意味着JavaScript有不同类型的函数,因为一个函数的行为不适用于另一个函数(当它的名称中有一个空格/是一个getter或setter)?
发布于 2020-06-03 14:24:38
当将函数赋值给变量或属性值(可能是getter)时,涉及两个名称:
这些名称是不同的实体,不一定是相同的。
下面是一个具有属性"a“的简单对象,其值为名称为”b“的函数:
let obj = {
a: function b() { }
};
console.log("property: ", Object.keys(obj)[0]); // "a"
console.log("function: ", obj.a.name); // "b"
现在,当函数没有显式的名称时,就给它一个名称:
let obj = {
a() { }
};
console.log("property: ", Object.keys(obj)[0]); // "a"
console.log("function: ", obj.a.name); // "a"
这可能会给人一种错误的印象,即两个名称都是一个字符串,但这不可能是正确的,因为可能将同一个函数对象分配给不同的属性:
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
,如下所示:
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
显式地将其设置为您的愿望,如下所示:
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"
结论
Object.getOwnPropertyDescriptor(object, propertyName).get
访问。发布于 2020-06-03 09:24:59
您应该将其作为普通属性访问,如下所示:
me["firstName"];
但是,如果您已经知道名称,您可以访问firstName值如下所示:
me.firstName
通常,如果要使用如下变量访问对象的属性,则使用第一种形式:
const person = new Person("John", "Doe");
const propertyName = "firstName";
const firstName = person[propertyName];
如果您想了解更多关于getter和getter的信息,请查看https://javascript.info/property-accessors和https://javascript.info/property-accessors。
下面是一个充分发挥作用的例子:
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])
发布于 2020-06-03 09:46:20
当这样做时:
get firstName() {
return this._firstName;
}
它定义了一个属性,而你必须调用它:
me.firstName;
这样做:
getFirstName() {
return this._firstName;
}
实际上定义了getter函数,您可以这样称呼它:
me.getFirstName();
也许这是有帮助的:https://developer.mozilla.org/de/docs/Web/JavaScript/Reference/Functions/get
https://stackoverflow.com/questions/62169309
复制相似问题