函数的原型和对象的原型分别是什么?它们之间有何关联?结合代码进行说明。
参考答案:
1. 对象的原型
- 每个对象都有一个内部属性
[[Prototype]](在 JS 中可以通过__proto__访问),指向它的原型对象。 - 通过原型对象,对象可以访问继承来的属性和方法。
- 对象的原型通常由 构造函数的
prototype属性 指定。
js
function Person(name) {
this.name = name;
}
Person.prototype.sayHello = function() {
console.log(`Hello, ${this.name}`);
};
const p = new Person('Alice');
console.log(p.__proto__ === Person.prototype); // true
p.sayHello(); // Hello, Alice解释:
p是对象实例,它的__proto__指向Person.prototype,所以能调用sayHello方法。
2. 函数的原型
- 函数本身也是对象,每个函数都有一个
prototype属性(注意和__proto__不同)。 prototype是给 使用该函数作为构造函数 创建的对象实例提供原型的。- 函数对象还有一个
__proto__,指向Function.prototype。
js
function Foo() {}
console.log(typeof Foo); // "function"
console.log(Foo.prototype); // {constructor: Foo},默认有 constructor 属性
console.log(Foo.__proto__ === Function.prototype); // true解释:
Foo.prototype是实例new Foo()的原型对象。Foo.__proto__是函数自身的原型,指向Function.prototype,因为函数也是对象。
3. 函数和对象原型之间的关联
- 对象的原型来自 构造函数的
prototype。 - 构造函数本身是函数对象,它的原型是
Function.prototype。 - 所有函数的原型链最终都指向
Object.prototype。
js
function Person(name) {
this.name = name;
}
const p = new Person('Bob');
console.log(p.__proto__ === Person.prototype); // true,实例的原型
console.log(Person.__proto__ === Function.prototype); // true,函数对象的原型
console.log(Function.prototype.__proto__ === Object.prototype); // true
console.log(Person.prototype.__proto__ === Object.prototype); // true原型链示意:
题目要点:
对象的原型 (
__proto__):指向创建它的构造函数的prototype,用于继承属性和方法。函数的原型 (
prototype):用于实例化对象时设置实例的原型。函数自身也是对象,有
__proto__指向Function.prototype。原型链关系:
- 对象实例 → 构造函数的
prototype→Object.prototype→null - 函数对象 →
Function.prototype→Object.prototype→null
- 对象实例 → 构造函数的