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'类型的参数。
作者最新文章
JavaScript闭包与类(Class)的区别及适用场景对比
2026-11-05 15:48:57
JavaScript入门要学ES6吗?let与箭头函数等新特性解析
2026-11-05 14:49:16
JavaScript 8种数据类型详解:基本类型与引用类型的区别
2026-11-05 14:25:15
怎么在JavaScript中使用async/await优化Ajax异步流程
2026-11-05 13:56:15
JavaScript replace回调函数实现动态正则替换逻辑
2026-11-05 13:52:13
