【问题标题】:Javascript - Every function an object?Javascript - 每个函数都是一个对象?
【发布时间】:2015-07-02 13:10:00
【问题描述】:

在 Javascript 中,每个函数都是一个对象。

function a() {
    this.x = function() { console.log("x"); }
}

这里的“a”是一个函数,它是一个对象。对吧?

var b = Object.create(a);
b.x(); //does not work!!

如果我们这样写,上面的代码就可以工作了 -

var b = Object.create(new a())

这是否意味着只有函数的实例才是对象?不是函数?

【问题讨论】:

  • 一个函数是一个对象,但函数内部this不是那个对象。它是调用者设置的上下文。
  • 如果你检查 - a 变量没有 x 属性 :-) 所以继承 b 也没有它
  • Frédéric 的评论更进一步,不仅this 不是对a 的引用,在不起作用的代码中,您从未真正调用过该函数,因此其中的代码还没有运行。
  • 您似乎有点困惑Object.create 的作用。 this 不调用作为构造函数传递的函数,用于新对象,而只是创建新对象并设置原型。

标签: javascript function object


【解决方案1】:

它们不是你用 new 关键字弄乱的函数的实例,new 关键字做了很多事情:

  • 创建了一个全新的对象
  • 新对象是 [[prototype]]-linked
  • 新对象被设置为函数调用的“this”绑定
  • 除非函数返回它自己的对象,否则新调用的调用 函数将返回新对象

在您的第一个示例中,您正在从没有任何 x 属性的函数 a 创建一个对象。

最后,您正在创建新的 a() 调用返回的对象的对象,该对象具有 x 属性,因为它是在执行 a 函数时分配的

【讨论】:

  • 这是一个非常准确的解释。
【解决方案2】:
function a() {
  this.x = function() { console.log("x"); }
}

var b = new a();

b.x();

函数就像class。您可以使用new 关键字创建实例或对象。

【讨论】:

  • 我认为从问题中可以清楚地看出,OP 已经知道 new 创建了一个实例。
  • 只是想指定函数更像是一个类而不是一个对象
  • 函数不是一个对象,它一个对象。
  • ECMAScript 5 中没有 class,即使它的行为部分类似。
【解决方案3】:

this 是什么取决于您如何使用a 函数。如果您不将其作为构造函数运行 函数(您不使用new 关键字),this 将指向外部范围。试试这个:

function a() {
   this.x = function() { console.log("x"); }
}
a();
console.log(window.x());

另一方面,当您编写new a() 时,您将其作为构造函数运行,在这种情况下this 指向新创建对象的实例。现在试试这个例子:

function a() {
   this.x = function() { console.log("x"); }
}
var b = new a(); // mind the "new" keyword here
console.log(b.x());
console.log(window.x);

作为每个函数都是对象的最简单证明:

function c() {};
c instanceof Object; // ;-)

【讨论】:

    【解决方案4】:

    每个函数都是类而不是对象,每个函数值都是对象。 一个类是一组对象,一个函数是一组函数值,因此每个函数都是一个类,在纯函数式编程的精神中,每个函数值都是一个对象。

    【讨论】:

      猜你喜欢
      • 2011-03-27
      • 2011-10-24
      • 2015-07-15
      • 2019-08-05
      • 1970-01-01
      • 2014-06-17
      • 2020-09-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多