Function.prototype 和 Object.prototype 都是 JavaScript 中的重要原型对象,它们分别用于所有函数对象和所有普通对象的原型链。它们有很多不同之处,主要体现在它们所代表的对象类型和功能上。
1. 作用域和对象类型
-
Object.prototype是所有普通 JavaScript 对象的原型。- 任何通过
object构造器(如new Object())或字面量(如{})创建的对象都继承自Object.prototype。 Object.prototype上定义了许多通用的属性和方法,比如toString()、hasOwnProperty()、valueOf()等。
- 任何通过
-
Function.prototype是所有函数对象的原型。- 任何通过
function关键字声明的函数,或通过new Function()构造的函数,都会继承自Function.prototype。 Function.prototype上定义了与函数相关的方法,如call()、apply()、bind()等。
- 任何通过
2. 原型链的区别
-
Object.prototype是最顶层的原型:- 所有普通对象(包括数组、日期对象等)最终都继承自
Object.prototype,并且它位于原型链的最顶端。 Object.prototype本身没有继承其他对象,它是原型链的"根"。
- 所有普通对象(包括数组、日期对象等)最终都继承自
-
Function.prototype继承自Object.prototype:- 所有函数对象都继承自
Function.prototype,因此,Function.prototype上的方法可以被所有函数使用。 - 同时,
Function.prototype也继承了Object.prototype,这意味着函数也可以访问Object.prototype上的方法。
- 所有函数对象都继承自
3. 核心属性和方法的区别
-
Object.prototype的常见属性和方法:toString(): 返回对象的字符串表示。hasOwnProperty(): 检查对象是否拥有某个自有属性。valueOf(): 返回对象的原始值。constructor: 指向创建该对象的构造函数。
-
Function.prototype的常见属性和方法:call(): 用于调用函数,并指定this上下文和传入的参数。apply(): 与call()类似,不过apply()接受参数是一个数组。bind(): 创建一个新的函数,绑定指定的this值和初始参数。constructor: 指向Function构造函数。
4. 构造器和实例的关系
-
Object.prototype是普通对象的构造器原型。所有对象的__proto__链接最终都会指向Object.prototype。因此,你可以通过对象访问到Object.prototype上的方法。-
例如:
javascriptconst obj = {}; console.log(obj.__proto__ === Object.prototype); // true
-
-
Function.prototype是函数对象的构造器原型。所有函数对象的__proto__链接最终指向Function.prototype。-
例如:
javascriptfunction foo() {} console.log(foo.__proto__ === Function.prototype); // true
-
5. 总结
| 特性 | Object.prototype |
Function.prototype |
|---|---|---|
| 作用 | 所有对象的原型 | 所有函数对象的原型 |
| 继承关系 | 是原型链的最顶层,没有继承其他对象 | 继承自 Object.prototype |
| 主要方法 | toString(), hasOwnProperty(), valueOf() |
call(), apply(), bind(), constructor |
| 构造器 | 所有普通对象(如 {})的构造器原型 |
所有函数(如通过 function 关键字声明的)构造器原型 |
例子
javascript
// 1. `Object.prototype`
const obj = {};
console.log(obj.hasOwnProperty('toString')); // true
console.log(obj.toString()); // '[object Object]'
console.log(obj.constructor === Object); // true
// 2. `Function.prototype`
function myFunction() {}
console.log(myFunction.call); // function call()
console.log(myFunction instanceof Function); // true
console.log(myFunction.constructor === Function); // true
总结
Object.prototype是所有对象的原型,提供了与对象相关的通用方法。Function.prototype是所有函数的原型,提供了与函数执行相关的专用方法,同时继承自Object.prototype,因此函数也能访问对象的一些通用方法。
这两者各自有不同的角色和功能,分别用于对象和函数类型的原型链。