为什么'这个'与函数对象一起使用时有何不同?

时间:2016-03-26 00:20:48

标签: javascript properties this

试图理解这个' JavaScript中的关键字,我查看了很多资源,包括这个流行的Stack Overflow问题的答案: How does the "this" keyword work?

我不知道我是否误解了某些内容,但我读过的所有内容似乎都是不完整的,并且错过了一条规则: 即使功能是对象,这个'对于函数对象与其他对象的区别对待。

请考虑以下代码:

var object = {};
object.name = "object";
object.logMyName = function() { 
  console.log(this.name);
};
object.logMyName();

因为在对象('对象')上调用了一个函数(' logMyName'),所以'这个'设置为调用函数(' logMyName')的对象(' object')。

现在考虑以下代码:

var funcObject = function() {};
funcObject.name = "funcObject";
funcObject.logMyName = function() { 
  console.log(this.name);
};
funcObject.logMyName();

虽然在一个对象(' funcObject')上调用了一个函数(' logMyName'),但这个'是设置为调用函数(' logMyName')的对象(' funcObject')。

为什么存在这种对象类型之间的差异,为什么很少/从未讨论过它?

1 个答案:

答案 0 :(得分:5)

那是因为函数具有特殊的name属性。

  

name属性的值是一个描述的属性的String   功能。该名称没有语义意义,但通常是一个   变量或属性名称,用于引用其中的函数   ECMAScript代码中的定义点。这家酒店有   属性{[[可写]]:错误,[[可枚举]]:错误,   [[Configurable]]: true }。

该属性不可写,因此您的分配将被忽略。

但是,由于它是可配置的,您可以重新定义它:

var funcObject = function() {};
Object.defineProperty(funcObject, 'name', {
  configurable: true,
  value: "funcObject"
});
funcObject.logMyName = function() { 
  console.log(this.name);
};
funcObject.logMyName(); // logs "funcObject"

请注意,在ES6将其标准化为可配置之前,一些旧浏览器将其实现为不可配置,因此上述代码可能无效。