bind 创建的绑定函数的 prototype 仅在目标函数为普通函数时被保留且可继承,否则为 undefined;其 prototype 不可写,且仅当原函数可构造时才支持 new 调用。

JavaScript中使用 bind 创建的绑定函数,其 prototype 属性**会被保留**,但仅在被绑定的目标函数本身具有 prototype(即是一个普通函数)时才有效;若目标函数是箭头函数、内置函数(如 Array.prototype.map)或没有 prototype 的函数,则绑定函数的 prototype 为 undefined。
绑定函数的 prototype 来源
当调用 fn.bind(obj, ...args) 时:
- 如果
fn是一个普通函数(非箭头、非内置、可构造),则绑定函数会继承fn.prototype—— 即boundFn.prototype === fn.prototype成立(严格相等); - 该绑定函数仍可被
new调用,此时会以fn.prototype作为新实例的原型; - 绑定函数自身不可写
prototype(它是不可配置、不可写的访问器属性),尝试赋值会被忽略(非严格模式下静默失败,严格模式下抛TypeError)。
常见不保留 prototype 的情况
以下情形中,绑定函数的 prototype 为 undefined:
-
绑定箭头函数:箭头函数没有
prototype属性,bind后仍无; -
绑定内置函数:如
parseInt.bind(null, 10),多数内置函数(ECMAScript 规范定义为 “non-constructable” 或 “built-in non-constructor”)不暴露prototype; -
绑定已删除 prototype 的函数:例如
function f(){}; delete f.prototype; f.bind()→ 绑定函数的prototype也为undefined。
验证 prototype 是否可用的小技巧
可通过以下方式安全检查:
立即学习“Java免费学习笔记(深入)”;
-
typeof boundFn.prototype === 'object'—— 判断是否具备可继承的原型; -
boundFn.prototype && 'constructor' in boundFn.prototype—— 确认它是一个典型的函数原型对象; - 尝试
new boundFn()并检查实例的__proto__是否等于原函数的prototype,可实证继承链是否生效。
实际开发中的注意事项
如果你依赖绑定函数支持 new 实例化(比如封装构造器并预设参数):
- 确保原始函数是普通函数且未篡改
prototype; - 避免对箭头函数或内置函数做
bind后用于构造; - 若需兼容性更强的“预设参数 + 可构造”,可手动包装为普通函数,而非依赖
bind的自动行为。










