原型与原型链-食铁獸

什么是原型?什么是原型链?刚刚接触时真的是灵魂的问题啊!好基友。。。。啊呸 ,好记忆不如烂笔头,还是得写下来留备后看。

一. 什么是原型?


prototype 就是原型,__proto__是隐式原型前后有两个下划线。它对外是隐藏的,我们在程序开发过程,不会直接使用它。

这两个东西是怎么来的?有什么用?二者关系如何?

说到 prototype__proto__的来历,不得不提JavaScript的诞生。

1. JavaScript“继承”机制诞生

1994年,JavaScript语言因为商业需要而被要求开放出来,由工程师Brendan Eich负责开放

大佬英姿
受到当时面向对象狂潮的影响,JavaScript里面所以的数据类型都是对象(object),但是需要一种机制将对象联系在一起,大佬Brendan Eich并没有引入类的概念,毕竟那样JavaScript就是完整的面向对象语言了,增加入门难度,那么问题来了,这种机制是什么?(原型链-小声哔哔)

2. prototypeconstructor__proto__

大佬Brendan Eich为了实现类似于继承的机制,给构造函数(constructor)设置了一个prototype属性,它是一个对象,即原型对象

每一个对象都有一个__proto__属性,又因为在JavaScript中一切皆对象,所以对于函数而言,每一个函数都会有一个prototype和一个__proto__属性

prototype中存放实例对象需要共享的属性和方法,那些不需要共享的属性和方法,就放在构造函数constructor里面,constructor指向这个函数,对象的__proto__属性指向创建这个对象的函数的prototype(很重要)

来点码

var o = {}
function Son() {}
// 用火狐控制台查看,效果显著
console.info(o)
console.info(Son)

在这里插入图片描述

二. 原型链是什么


由上面可知,大佬Brendan Eich 为了联系JavaScript对象,设置了
prototype__proto__属性,实现了“继承”,而在“继承”的过程中,实例通过prototype搜索属性的轨迹就像一条链条,prototype充当链接的作用,所以称这条链条为原型链。

原型链本链:

constructor1.prototype = instance2

如果试图引用constructor1构造的实例instance1的某个属性p1:

  1. 首先会在instance1内部属性中找一遍;
  2. 接着会在instance1.__proto__(constructor1.prototype)中找一遍,而constructor1.prototype 实际上是instance2, 也就是说在instance2中寻找该属性p1;
  3. 如果instance2中还是没有,此时程序不会灰心,它会继续在instance2.__proto__(constructor2.prototype)中寻找…直至Object的原型对象
function Person() {
    }
Person.prototype.name = "一个A";
Person.prototype.age = 18;
Person.prototype.sayHello = function () {
    console.log(this.name)
    }

    // 1. 创建一个空对象
    // 2. 将this指向这个对象
    // 3. 执行构造函数
    // 4. 返回这个对象
let p = new Person()
    // p.sayHello()    // 一个A

function Student() {
}
Student.prototype = Object.create(Person.prototype)
var s = new Student()
s.sayHello()   //一个A

千锋教育图(太多了不想画)

三. new


原型与原型链在面试时往往与new运算符一起被考量,不能落别人一步(我***一生不弱于人-小声哔哔)

首先要知道的是new运算符干了什么:

  1. 创建一个空对象,并且 this 变量引用该对象,同时还继承了该函数的原型。

  2. 属性和方法被加入到 this 引用的对象中。

  3. 新创建的对象由 this 所引用,并且最后隐式的返回 thi

来点代码方便理解

 function Per() {

    }

    Per.prototype.name = "一个A";
    Per.prototype.age = 18;
    Per.prototype.say = function () {
        console.log(this.name)
    }

    // 1. 创建一个空对象
    // 2. 将this指向这个对象
    // 3. 执行构造函数
    // 4. 返回这个对象
    let p = new Per()
    p.say()    // 一个A

    
    // 效果分解
    let ps
    ps = Per.prototype
    console.log(ps.age)   //18
用自己的话来说明这样一个问题还是有点勉强,有错误和不足请批评指出(。・ω・。)

来点补给,再次感谢阅读٩(๑>◡<๑)۶

路易斯大师调教原型链

解析原型链高清详细

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值