访问器属性及其函数名称
Accessor properties and their function names
ECMAScript 6 中的所有函数都将具有适当的名称值 属性。那么访问器属性(getter 和 setter)的那些名称呢?
示例(来自 Understanding ECMAScript 6 书):
var doSomething = function doSomethingElse() {
// empty
};
var person = {
get firstName() {
return "Nicholas"
},
sayName: function() {
console.log(this.name);
}
}
console.log(doSomething.name); // "doSomethingElse"
console.log(person.sayName.name); // "sayName"
console.log(person.firstName.name); // undefined, instead of "get firstName"
你能解释一下为什么 person.firstName.name
returns undefined
吗?
因为person.firstName === "Nicholas"
和"Nicholas".name
不存在
当使用 getter
时,您直接访问实际的 returned 值,就执行它的行理解而言,您并没有调用函数,这与尝试相同:
var obj = { something: 'someValue' };
console.log(obj.something.name);
哪个 return 也未定义。
因为person.firstName
是return值的类型,所以string
,而string没有属性.name
person.sayname
和 doSomethingElse
是函数并且有 .name
属性
console.log(typeof doSomething); // function
console.log(typeof person.sayName); // function
console.log(typeof person.firstName); // string
我认为这是因为 属性 name
仅用于 函数 或 类, 不适用于 变量.
如果您有代码:
let var1 = "non function";
let var2 = {};
let var3 = function(){};
let var4 = function hello(){};
let var5 = class AClass{};
console.log(var1.name); // undefined
console.log(var2.name); // undefined
console.log(var3.name); // var3
console.log(var4.name); // hello
console.log(var5.name); // AClass
您可以看到 var1
和 var2
不是函数,或者 类 和其他函数是 属性 name
。
因为 person.firstName
是 getter,return 值是 getter return 的任何值(在您的示例中为 "Nicholas"
) ,而不是 getter 函数本身,因此您不能以这种方式访问它的名称。
为了得到函数的引用,可以使用Object.getOwnPropertyDescriptor
:
var person = {
get firstName() {
return "Nicholas"
},
}
var descriptor = Object.getOwnPropertyDescriptor(person, 'firstName');
console.log(descriptor);
console.log(descriptor.get.name);
ECMAScript 6 中的所有函数都将具有适当的名称值 属性。那么访问器属性(getter 和 setter)的那些名称呢?
示例(来自 Understanding ECMAScript 6 书):
var doSomething = function doSomethingElse() {
// empty
};
var person = {
get firstName() {
return "Nicholas"
},
sayName: function() {
console.log(this.name);
}
}
console.log(doSomething.name); // "doSomethingElse"
console.log(person.sayName.name); // "sayName"
console.log(person.firstName.name); // undefined, instead of "get firstName"
你能解释一下为什么 person.firstName.name
returns undefined
吗?
因为person.firstName === "Nicholas"
和"Nicholas".name
不存在
当使用 getter
时,您直接访问实际的 returned 值,就执行它的行理解而言,您并没有调用函数,这与尝试相同:
var obj = { something: 'someValue' };
console.log(obj.something.name);
哪个 return 也未定义。
因为person.firstName
是return值的类型,所以string
,而string没有属性.name
person.sayname
和 doSomethingElse
是函数并且有 .name
属性
console.log(typeof doSomething); // function
console.log(typeof person.sayName); // function
console.log(typeof person.firstName); // string
我认为这是因为 属性 name
仅用于 函数 或 类, 不适用于 变量.
如果您有代码:
let var1 = "non function";
let var2 = {};
let var3 = function(){};
let var4 = function hello(){};
let var5 = class AClass{};
console.log(var1.name); // undefined
console.log(var2.name); // undefined
console.log(var3.name); // var3
console.log(var4.name); // hello
console.log(var5.name); // AClass
您可以看到 var1
和 var2
不是函数,或者 类 和其他函数是 属性 name
。
因为 person.firstName
是 getter,return 值是 getter return 的任何值(在您的示例中为 "Nicholas"
) ,而不是 getter 函数本身,因此您不能以这种方式访问它的名称。
为了得到函数的引用,可以使用Object.getOwnPropertyDescriptor
:
var person = {
get firstName() {
return "Nicholas"
},
}
var descriptor = Object.getOwnPropertyDescriptor(person, 'firstName');
console.log(descriptor);
console.log(descriptor.get.name);