JS 显示原型、隐式原型与原型链 / 构造函数、实例、实例原型之间的关系

本文探讨了JavaScript中的原型链概念,解释了构造函数、原型对象和实例之间的相互关系。每个构造函数有一个原型对象,原型对象含有构造函数的引用,而实例则指向原型。通过原型链,可以实现对象间的属性和方法继承。JavaScript中的原型不是复制,而是委托,因此使用'委托'而非'继承'更为准确。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

什么是原型链

原型链是利用原型,让一个引用类型继承另一个 引用类型的属性和方法。

为了说明白原型链,需要从构造函数、原型与实例的关系讲起。

构造函数、原型与实例的关系:

  • 每个构造函数都有一个原型对象
  • 原型对象都包含一个指向构造函数的指针(显式原型),
  • 实例都包含一个指向原型对象的内部指针(隐式原型)。

那么,假如让原型对象等于另一个类型的实例,结果会让此事的原型对象包含一个指向另一个原型的指针,相应地,另一个原型中也包含着指向另一个构造函数的指针。

假如另一个原型又是另一个类型的实例,那么上述关系依然成立。

如此层层递进,就构成了实例与原型的链条。

这就是原型链的基本概念。

JavaScript 只是在对象之间创建关联,所以两个对象之间的关系并不是复制而是委托。

所以,相比之下,说委托继承更合适。

显式原型:

  • 每一个函数在创建之后都会拥有一个名为 prototype 的属性,这个属性指向函数的原型对象。

隐式原型:

  • JavaScript 中任意对象都有一个内置属性 [[prototype]]
  • 在ES5之前没有标准的方法访问这个内置属性,但是大多数浏览器都支持通过 __proto__ 来访问。
  • ES5 中有了对于这个内置属性标准的 Get 方法 Object.getPrototypeOf()
  • Object.prototype这个对象是个例外,它的proto值为null

图片描述

原型链图片描述

代码描述

function Person() {}
person = new Person();

console.log(person.__proto__ === Person.prototype);
console.log(Object.getPrototypeOf(person) === Person.prototype);
console.log(person.constructor === Person); // 注①
console.log(Person.prototype.__proto__ === Object.prototype); //注②
console.log(Object.prototype.__proto__ === null);
console.log(Person.prototype.constructor === Person);
console.log(Object.__proto__ === Function.prototype); //注③
console.log(Function.prototype.__proto__ === Object.prototype);

输出全是 true


person.constructor === Person.prototype.constructor 原型链
② Person.prototype 是对象,是 Object 类型的实例
③ Object 是构造函数,于是它是 Function 的实例,其内部有 [[proto]]指向实例的原型

参考:https://github.com/mqyqingfeng/Blog/issues/2

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值