谈谈你对原型的理解?什么是原型链?【原型链解决的是什么问题?】prototype 和 __proto__ 区别是什么?

谈谈你对原型的理解?

在 JavaScript 中,每个函数对象都有一个prototype 属性,这个属性指向函数的原型对象。使用原型对象的好处是所有对象实例共享它所包含的属性和方法。

什么是原型链?【原型链解决的是什么问题?】

原型链解决的主要是继承问题。

每个对象拥有一个原型对象,通过 __proto__ (读音: dunder proto) 指向其原型对象,并从中继承方法和属性,同时原型对象也可能拥有原型,这样一层一层,最终指向null(Object.prototype.__proto__ 指向的是null)。这种关系被称为原型链,通过原型链,一个对象可以拥有定义在其他对象中的属性和方法。

构造函数 Parent、Parent.prototype 和 实例 p 的关系如下:(p.__proto__ === Parent.prototype)

__proto__ (读音: dunder proto,dunder是“double underscore”的简拼)

prototype 和 __proto__ 区别是什么?

prototype是构造函数的属性。
__proto__ 是每个实例都有的属性,指向其原型对象。
实例的__proto__ 与其构造函数的prototype指向的是同一个对象。

解析原型链

实例对象和构造函数都可以指向原型:

function Person() {

}
var person = new Person();
console.log(person.__proto__ === Person.prototype); //true

在这里插入图片描述
既然实例对象和构造函数都可以指向原型,那么原型是否有属性指向构造函数或者实例呢?

constructor

指向实例倒是没有,因为一个构造函数可以生成多个实例,但是原型指向构造函数倒是有的,这就要讲到第三个属性:construcotr,每个原型都有一个constructor属性指向关联的构造函数

function Person() {

}
console.log(Person === Person.prototype.constructor); //true

所以再更新下关系图:
在这里插入图片描述
综上我们已经得出:

function Person() {
}

var person = new Person();

console.log(person.__proto__ == Person.prototype) // true
console.log(Person.prototype.constructor == Person) // true
// 顺便学习一个ES5的方法,可以获得对象的原型
console.log(Object.getPrototypeOf(person) === Person.prototype) //true

原型对象也可能拥有原型,这样一层一层,最终指向null(Object.prototype.__proto__ 指向的是null)。

最终关系图:
在这里插入图片描述

参考

  • https://juejin.cn/post/6844903472836395022#heading-0
  • https://juejin.cn/post/6844903815053852685#heading-17
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
原型链Prototype Chain)是JavaScript中实现继承的一种方式。每个对象都有一个内部属性_proto_ ,该属性指向了该对象的原型对象。原型对象也有自己的_proto_属性,指向其原型对象。实际上,原型链就是通过_proto_属性将多个对象串联起来形成的链。 原型链的工作原理是当访问一个对象的属性时,如果该对象本身没有定义这个属性,则会去其_proto_属性指向的原型对象上查找该属性。如果原型对象也没有定义这个属性,则会去原型对象的_proto_属性指向的原型对象上查找,依次类推,直到找到该属性或者找到最顶层的Object对象,如果仍然没有找到该属性,则返回undefined。 通过原型链,可以实现属性的继承。当我们创建一个对象时,可以指定其原型对象,该对象就可以继承原型对象上的属性和方法。当访问一个对象的属性时,如果对象本身没有定义该属性,就会去其原型对象上查找,从而实现属性的继承。 尽管原型链在实现继承上非常强大,但是如果多个对象共享同一个原型对象,那么在原型对象上的属性的修改会影响到所有的对象。因此,在使用原型链实现继承时要注意避免对原型对象上属性的直接修改,可以通过在子对象中重新定义同名属性来避免这个问题。 总之,原型链JavaScript中实现继承的一种机制,通过_proto_属性将多个对象连接成链状结构。通过原型链,可以实现属性的继承,并且可以通过在子对象中重新定义同名属性来扩展或者修改继承的属性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值