JavaScript中inherit()函数处理function类型原型的原理

作者:半夏时间:2026-10-27 08:58:10浏览:601

本文解析《JavaScript权威指南》中inherit()辅助函数的实现细节,重点探讨为何该函数允许传递function类型的参数作为原型。通过代码示例说明在JavaScript中函数也是对象,可以拥有属性和方法,从而验证传递function类型生成新对象的可行性。

最近在研读《JavaScript权威指南》(第六版)时,注意到第六章第122页包含一段相关代码:

具体代码如下:

// 返回一个继承自原型对象proto属性的新对象
// 此处可借助ES5的Object.create()函数
function inherit(proto) {
// proto必须为对象,且不能为null
if(proto == null) throw TypeError();
if(Object.create) return Object.create(proto); // 若Object.create()可用,则直接调用
var t = typeof proto; // 否则进行进一步类型检查
if(t!=='object' && t!=='function') throw TypeError();
var F = function() {}; // 定义一个空的构造函数
F.prototype = proto; // 将该构造函数的原型属性指向proto
return new F(); // 通过new F()创建继承自proto的新对象
}

显然,该辅助函数的核心目的是创建一个继承自指定父类原型的新对象。

问题

在阅读以下判断逻辑时,产生了一些疑惑:

相关代码如下:

var t = typeof proto; // 否则进行进一步类型检查
if(t!=='object' && t!=='function') throw TypeError();

通常我们认为原型对象应该是Object实例或字面量形式,那么传递的参数类型是否真的会出现“function”这种情况呢?

理解

函数本质上也是对象,它可以拥有自己的属性和方法。需要注意的是,这里指的并非静态属性和方法,而是将函数视为可以动态添加属性的对象实体。

验证代码如下:

// 测试传递function类型的情况
var func = function() {};
func.text = 'good work';
func.getText = function() {
return func.text;
};
console.log(typeof func); // 输出:'function'
// 传递function类型,返回以func为原型的新对象
var subFunc = inherit(func);
console.log(subFunc.getText()); // 输出:'good work'

上述证明表明,确实可以传递'function'类型的参数。

 

作者最新文章