函数对象 vs 函数实例对象
首先,在 JavaScript 中,函数也是一个对象。我指的不是由 new() 构造函数创建的对象,而是函数本身。为避免混淆,我将这种对象称为
函数对象,用 new() 构造函数创建的对象称为
函数实例对象。
_ proto _ 和 prototype 属性
在 JavaScript 中,任何
函数对象都有两个属性:
_ proto _和
prototype。此外,任何
函数实例对象(使用 new 构造函数创建)都具有一个
_ proto _属性。
_ proto _ 定义了继承关系。 关于这方面的一些好资源可以在以下链接中找到:
http://zeekat.nl/articles/constructors-considered-mildly-confusing.html
如何定义继承?
如果对象 objA 和 objC 通过任意数量的
_ proto _ 相连,则 objA 继承了另一个对象 objC。因此,如果 objA 的
_ proto _等于 objB,objB 的
_ proto _等于 objC,则 objA 继承了 objB 和 objC,而 objB 继承了 objC。
什么是继承?
它意味着任何继承对象都可以使用继承对象的任何属性。
Function.prototype 是什么意思?
每个 函数对象 的 _proto_ 属性都指向它的原型对象,也就是 Function.prototype 对象。这意味着每个 函数对象 都可以访问 Function.prototype 的属性,因为每个 函数对象 都继承了 Function.prototype 对象。这也意味着,如果在 Function.prototype 对象中添加了 method 属性,那么在 JavaScript 中所有可能的 函数对象 (包括字符串、数字等)都将可以使用它。
this.prototype[name] = func;
当从像数字、字符串等 函数对象 中调用 'method' 时,this 指向 函数对象。这意味着我们现在在 函数对象 中有一个名为 "name" 的新属性,并且它是一个函数 'func'。
函数对象的 prototype 属性有什么用?
函数对象 的 prototype 属性是使用该函数的 new 构造函数创建的 函数实例对象 的 _ proto _ 所引用的。
如果执行以下代码:
Number.method('integer', function () {...});
那么 Number.prototype 就有了定义在其中的 integer 方法。这意味着每个数字 函数实例对象,比如 new Number(2.4),都会从 Number.prototype 中 "继承" 这个新的属性 'integer',因为这个数字 函数实例对象 的 _ proto _ 会被设置为 Number.prototype。
Number
如何从Function
派生出来的。 - Kevin Ji