理解JavaScript原型链

一、什么是原型链
每一个构造函数都有一个原型对象(prototype),原型有一个属性(constructor)指回构造函数,而构造函数所创建的实例有一个内部指针(proto)指向原型,如果原型是另一个类型的实例,原型就有一个内部指针指(proto)向另一个原型,另一个原型有一个指针指向另一个构造函数,这样就形成了原型链。
关系图
在ECMAscript中将原型链作为实现继承的主要方法
正常的原型链都会终止于Object
Object 原型的原型是null在这里插入图片描述
二、__proto__与prototype的区别

proto:是实例对象指向原型对象的指针,隐式原型,是每个对象都会有的一个属性。

prototype:是构造函数的原型对象,显式原型,只有函数才会有。并不是每个函数都有prototype这个属Function.prototype.bind()就没有。

三、涉及相关方法
1:Object.getPrototypeOf() 方法返回指定对象的原型(内部[[Prototype]]属性的值)
语法:

Object.getPrototypeOf(object)

JavaScript中的 Object 是构造函数(创建对象的包装器
Object.getPrototypeOf( Object )是把Object这一构造函数看作对象,返回的当然是函数对象的原型。

Object.getPrototypeOf( Object ) === Function.prototype

2:Object.create()方法创建一个新对象,使用现有的对象来提供新创建的对象的__proto__。

const me = Object.create(person);
// me拥有person的使用属性和方法

如果你关心性能,你应该避免设置一个对象的 [[Prototype]]。相反,你应该使用 Object.create()来创建带有你想要的[[Prototype]]的新对象。
3:Object.setPrototypeOf() 方法设置一个指定的对象的原型 ( 即, 内部[[Prototype]]属性)到另一个对象或 null。
语法:

Object.setPrototypeOf(obj, prototype)

obj:要设置其原型的对象。.
prototype:该对象的新原型(一个对象 或 null).
4: Object.prototype.isPrototypeOf()
isPrototypeOf() 方法用于测试一个对象是否存在于另一个对象的原型链上。
语法:

prototypeObj.isPrototypeOf(object)
// 在object原型链上查找是否有prototypeObj

5.instanceof 运算符用于检测构造函数的 prototype 属性是否出现在某个实例对象的原型链上。
语法:

object instanceof constructor
// instanceof 运算符用来检测 constructor.prototype 是否存在于参数 object 的原型链上

6:Object.prototype.hasOwnProperty()
hasOwnProperty() 方法会返回一个布尔值,指示对象自身属性中是否具有指定的属性(也就是,是否有指定的键)。
语法:

obj.hasOwnProperty(prop)
// 只有属性存在于实例上才返回true

prop:要检测的属性的 String 字符串形式表示的名称,或者 Symbol。
7: in操作符
如果指定的属性在指定的对象或其原型链中,则in 运算符返回true。
语法:

prop in object

8:Object.keys返回一个所有元素为字符串的数组,其元素来自于从给定的object上面可直接枚举的属性。这些属性的顺序与手动遍历该对象属性时的一致。
语法:

Object.keys(obj)

输出可枚举的属性
9:其自身的可枚举和不可枚举属性的名称被返回
语法:

Object.getOwnPropertyNames(obj)

参照文章:
https://zhuanlan.zhihu.com/p/35790971
https://www.nowcoder.com/ta/review-frontend/review?page=286
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/instanceof

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值