Javascript - 每个函数都是一个对象吗?

4

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())

那么这是否意味着只有函数的实例才是对象?而不是函数本身?

1
一个函数是一个对象,但在函数内部,this不是那个对象。它是由调用者设置的上下文。 - Frédéric Hamidi
如果你检查一下变量 a 是否有属性 x,那么继承的变量 b 也不会有它。 - Grundy
1
进一步回应Frédéric的评论,不仅this不是对a的引用,在那段无法运行的代码中,您从未实际调用该函数,因此其中的代码尚未运行。 - nnnnnn
似乎你对Object.create函数有些困惑。它并不像构造函数一样调用传递的函数来创建新对象,而只是创建一个新对象并设置原型。 - Grundy
4个回答

2
他们不是函数的实例。你正在使用new关键字,new关键字有很多作用:
  • 创建一个全新的对象
  • 将新对象与[[prototype]]链接
  • 将新对象设置为函数调用的'this'绑定
  • 除非函数返回自己的对象,否则新调用的函数将返回新对象
在你的第一个例子中,你从函数a创建了一个对象,该函数没有任何x属性。
在最后一个例子中,你创建了一个通过new a()调用返回的对象的对象,该对象具有x属性,因为它在执行a函数时被分配。

这是一个相当准确的解释。 - GottZ

1

“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; // ;-)

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

var b = new a();

b.x();

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

1
我认为从问题中可以清楚地看出,OP已经知道new创建了一个实例。 - nnnnnn
只是想指明这个函数更像一个类而不是一个对象。 - Felix A J
1
一个函数不仅仅是像一个对象,它本身就是一个对象。 - nnnnnn
在ECMAScript 5中没有class,尽管它部分地像。 - TaoPR

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接