JS | 知识点总结 - 原型链

省流,总结图:


原型链

原型链: 通过 proto 进行连接
每个对象都有一个内部属性 [[ Prototype ]],在浏览器中可以通过 proto 访问,现代浏览器中推荐用 Object.getPrototypeOf()
在 JS 中, 每个函数都有一个默认的 prototype 属性,这个属性会在该函数被 new 调用时成为新创建实例对象的 proto (即 原型)。
修改 构造函数.prototype <==> 修改 将来通过 new 构造函数() 创建的对象的原型链。

关键公式:

指向构造函数的 prototype:p.proto === Person.prototype

默认指回构造函数本身:Person.prototype.constructor === Person

标准方式:Object.getPrototypeOf(p) === Person.prototype;

p.constructor = p.proto.constructor

(注: p为实例,Person构造函数,Person.prototype为构造函数的原型。)

(注:图中应为 Object.getPrototypeOf() )


原型链继承

Object.create( 新对象的原型对象, [新对象定义属性] ):用现有对象 来作为 新对象的原型(即 proto

const 新对象 = Object.create(现有对象)

等价于

新对象.proto === 现有对象

------》 例子:即 类似于 新对象=实例,对象=原型对象------》实例.proto = 原型对象

例子------ 原型链的总结

Chinese.prototype**.proto** = Human.prototype;

等价于 Chinese.prototype = Object.create (Human.prototype)

等价于 Chinese.prototype = new Human(); 【存在变量同享的污染可能。】


为什么是修改 Chinese 的原型对象 prototype 呢?

修改 构造函数.prototype

<==> 修改 将来通过 new 构造函数() 创建的对象的原型链。

② 让返回的 新函数的原型对象 继承 来自 原函数的原型对象(通过原型链)。


Object.create(proto) 用来创建一个继承自 proto 的新对象

语法 Object.create(prototype, [propertiesObject])

  • prototype :新对象的原型对象(可以为 null

  • propertiesObject (可选):为新对象定义的自身属性(类似于 Object.defineProperties


其他知识点------ 继承:

知识点 说明
构造函数继承 Parent.call(this, args...)
原型链继承 Child.prototype = Object.create(Parent.prototype)
原型方法添加 Constructor.prototype.methodName= function() {}
修正 constructor 否则 子类实例的 constructor 会指向父类. 即 Constructor**.prototype.constructor** = Constructor
prototype vs proto prototype 是构造函数的原型对象,__proto__实例指向原型的属性

原型方法定义 不能带括号,也不要用箭头函数。------》 ✅ xxx**.prototype.** 方法 = function() {...}

(箭头函数,this是外部上下文;方法的不能带括号。X Number.prototype._isPrime**( )** {})


其他知识点

对象属性的遍历(es6中对象新增的总结)

Object.keys(obj):返回一个数组,包含对象自身可枚举的属性名(不含原型链上的属性)

Object.getOwnPropertyNames():返回一个数组,包含指定对象自身 所有的属性(含可枚举和不可枚举的属性)


Object.getPrototypeOf(obj) :获取对象的原型(即 父对象)。------》获取原型链的属性const protoProps = Object.getOwnPropertyNames(Object.getPrototypeOf(obj));


对象的原型 :①隐式原型, [[Prototype]]属性 ②显式原型 prototype属性 (图片知识点链接

相关推荐
Cobyte18 小时前
12.响应式系统演进:揭秘多级脏检查机制的设计哲学与实现原理(Vue3.4)
前端·javascript·vue.js
我还记得那天18 小时前
用C语言实现一个简易扫雷小游戏
c语言·开发语言
段ヤシ.18 小时前
回顾Java知识点,面试题汇总Day10(持续更新)
java·开发语言·spring
小明同学0118 小时前
C++后端项目:统一大模型接入 SDK(二)
开发语言·c++
我不是懒洋洋18 小时前
【C++】类和对象( 类的定义、实例化、 this指针、 C++和C语言实现Stack对比)
c语言·开发语言·数据结构·c++·经验分享·算法·visual studio
Perry 12318 小时前
Java中的多态
java·开发语言
ZC跨境爬虫18 小时前
跟着 MDN 学CSS day_1:(CSS 基石与色彩的艺术)
前端·javascript·css·ui·html
2501_9307077819 小时前
使用C#代码拆分 PowerPoint 演示文稿
开发语言·c#·powerpoint
故事和你9119 小时前
洛谷-【图论2-3】最小生成树1
开发语言·数据结构·c++·算法·动态规划·图论
砍材农夫19 小时前
物联网 基于netty构建mqtt协议规范(三种 QoS 等级)
java·开发语言·物联网