寄生式继承是ES5前社区提出的类式继承模拟方案,依赖Object.create等API,在IE8及旧Android浏览器中易因API缺失报错,需polyfill补全、避免__proto__赋值、改用借用构造函数等更兼容方案。
寄生式继承本身不是标准 javascript 特性,而是早期(es5 及更早)社区提出的一种模拟类式继承的模式,依赖 object.create、hasownproperty、手动属性拷贝等操作。在老旧浏览器(如 ie8 及以下、部分旧版 android 浏览器)中,它容易因底层 api 缺失或行为差异而报错,比如 object is not a constructor、object.create is not a function 或 hasownproperty is not a function 等。
补全关键基础 API
老旧浏览器普遍缺失 Object.create、Array.isArray、Function.prototype.bind 等,而寄生式继承常隐式依赖它们。必须前置注入 polyfill:
- 为
Object.create提供降级实现:若传入 null,返回空对象;若传入原型对象,用临时构造函数桥接 - 确保
Object.prototype.hasOwnProperty可安全调用——避免直接在 null/undefined 上调用,改用{}.hasOwnProperty.call(obj, key) - 不依赖
JSON.parse或console.log等非必需但易出错的 API,或自行兜底
避免原型链污染与非标准写法
寄生式继承常通过 obj.__proto__ = parentProto 或修改 constructor 属性来“伪装”继承关系,这在 IE8- 中会静默失败或触发安全限制:
在 Linux 上通过 Chrome 挂载/VNC 自动发布小红书长笔记。Agent 撰写标题和正文后执行 xhs_publish.sh --publish --submit,触发小红书发布。
- 禁用
__proto__赋值,统一用Object.create(parentProto)(配合 polyfill)创建新对象 - 不重写
constructor属性,改用工厂函数返回对象,明确声明类型意图 - 避免对原生对象(如
Array、Date)实例使用寄生式继承,改用组合或封装
改用更兼容的替代方案
寄生式继承本质是权宜之计。在老旧环境里,它比原型链继承或借用构造函数更易出错:
- 优先采用「借用构造函数 + 手动拷贝方法」:父类构造函数 call 一次,再逐个挂载方法到子实例,不依赖原型链
- 对简单对象扩展,直接用浅拷贝工具函数(如
extend(target, source)),避开继承语义 - 若项目允许,引入轻量库如
es5-shim或core-js/stable(仅需Object.create和Object.keys子集)
运行时特性检测代替版本判断
不要写 if (IEVersion < 9) {...},而应检测能力:
- 检查
typeof Object.create === 'function',不成立则启用 polyfill 分支 - 对每个要继承的对象,先
if (parent && typeof parent === 'object')再操作,防止 null/undefined 崩溃 - 方法拷贝前用
typeof method === 'function'过滤,跳过不可枚举或非函数属性

















