2021-05-15原型对象和原型链的理解

原型对象和原型链的理解


前言

对于前端初学者的我来说,JavaScript的原型是一个头疼的问题,在学习过程中容易混淆prototype和__proto__之间的关系,他们的各种指向也让人缭乱。
prototype和__proto__之间关系还处于迷糊之中,又出现了一个原型链,这就让我更加缭乱了。在查阅资料后,有了一些浅显地理解,错误之处望各位指教!


一、prototype原型对象

1.概念:在JavaScript中,我们声明一个函数, 那么浏览器就会在内存中创建一个对象,而且每个函数都默认会有一个属性 prototype 指向了这个对象( 即:prototype的属性的值是这个对象 )。这个对象就是函数的原型对象,简称函数的原型。

2.作用:开发中常有一些公共方法,而这些方法我们可以通过添加到构造函数的原型对象prototype上,这样构造函数构造的对象都可共享这些方法。

function Fn1(name) {
      this.name = name;
    }
 // 可已将方法保存到原型对象上,实例化对象也可以访问,但是不用保存,节省内存
    Fn1.prototype.say = function () {
      console.log(this.name + '喜欢丝袜奶茶!');
    }
    let f3 = new Fn1('zs');
    let f4 = new Fn1('ls');
    console.log(f3, f4);
    f3.say();
    f4.say();

二、对象原型__proto__

1.只要是对象即存在__proto__,指向构造函数的原型对象。
2.之所以我们对象可以使用构造函数prototype原型对象的属性和方法,就是因为对象有_ proto 原型的存在。

function Fn1(name) {
      this.name = name;
    }
 // 可已将方法保存到原型对象上,实例化对象也可以访问,但是不用保存,节省内存
    Fn1.prototype.say = function () {
      console.log(this.name + '喜欢丝袜奶茶!');
    }
    let f3 = new Fn1('zs');
    let f4 = new Fn1('ls');
    console.log(f3, f4);
    f3.say();
    f4.say();

在这里插入图片描述

三、构造函数、prototype原型对象与对象原型__proto__的关系

1.方法查找原则的应用
(1)首先看对象身上是否有某种方法,如果有就执行这个对象上的方法。
(2)如果对象上没有,因为对象中含有__proto__存在,就会去原型对象prototype身上查找。

2.__proto__对象原型和原型对象prototype是等价的。__proto__对象原型的意义就在于为对象的直找机制提供一个方向,或者说一条路线,但是它是一个非标准属性,因此实际开发中,不可以使用这个属性,它只是内部指向原型对象prototype。

3.如果我们修改了原来的原型对象,给原型对象赋值的是一个对象,则需利用constructor指回原来的构造函数。

在这里插入图片描述

三、原型链

1.只要是对象即存在__proto__,并指向prototype.
2.原型对象(prototype)里面的__proto__原型指向的是Object.prototype
3.Object.prototype中原型对象(prototype)里面的__proto__原型指向的是null.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值