方法的 name 属性

函数的name属性,返回函数名。对象方法也是函数,因此也有name属性。

  1. const person = {
  2. sayName() {
  3. console.log('hello!');
  4. },
  5. };
  6. person.sayName.name // "sayName"

上面代码中,方法的name属性返回函数名(即方法名)。

如果对象的方法使用了取值函数(getter)和存值函数(setter),则name属性不是在该方法上面,而是该方法的属性的描述对象的getset属性上面,返回值是方法名前加上getset

  1. const obj = {
  2. get foo() {},
  3. set foo(x) {}
  4. };
  5. obj.foo.name
  6. // TypeError: Cannot read property 'name' of undefined
  7. const descriptor = Object.getOwnPropertyDescriptor(obj, 'foo');
  8. descriptor.get.name // "get foo"
  9. descriptor.set.name // "set foo"

有两种特殊情况:bind方法创造的函数,name属性返回bound加上原函数的名字;Function构造函数创造的函数,name属性返回anonymous

  1. (new Function()).name // "anonymous"
  2. var doSomething = function() {
  3. // ...
  4. };
  5. doSomething.bind().name // "bound doSomething"

如果对象的方法是一个 Symbol 值,那么name属性返回的是这个 Symbol 值的描述。

  1. const key1 = Symbol('description');
  2. const key2 = Symbol();
  3. let obj = {
  4. [key1]() {},
  5. [key2]() {},
  6. };
  7. obj[key1].name // "[description]"
  8. obj[key2].name // ""

上面代码中,key1对应的 Symbol 值有描述,key2没有。