2022年了,你还不会原型链,是不是out了?

前言:


有的小伙伴,要到面试了,急匆匆的来网上看,又不知道谁对谁错,急急忙忙的就把被人的笔记原封不动的拿去了,到面试的时候,感觉自己回答的还不错,结果都不知道回答的是错误的。在这里我告诫大家,我们不要为了面试而去背题,匆匆忙忙的,不仅学不进去,背完了几天后马上会忘记

 

 有的人又要说了:‘这不是要找工作,没办法嘛!’ 其实我是想说,学习是平常时间的一个积累,而不是投机弄巧,是一个厚积薄发的过程。

下面为大家简单阐述我对原型和原型链的理解,若是觉得有说的不对的地方,还望直接把页面关闭了!


原型五个规则:

规则一:

1. 所有的引用类型(数组, 对象, 函数), 都具有对象的特性, 可以自由扩展特性

const obj = {}  // obj.a = 100
const arr = {}  // arr.a = 100
function fn() { }  // fn.a = 100

 

规则二:

2. 所有的对象, 都有一个__proto__属性, 属性值是一个普通的对象 (__proto__  ==> [[prototype]])

console.log(obj.__proto__)
console.log(arr.__proto__)
console.log(fn.__proto__)
// __proto__ 也叫作隐式原型

 

规则三:

3. 所有的函数, 都有一个prototype属性, 属性值也是一个普通的对象 ===>(原型对象)

console.log(fn.prototype)  // prototype 显示原型

 

规则四:

4.所有对象的隐式原型,指向它的构造函数的显示原型(理解为等于)

function Person(name, age) {
    this.name = name
    this.age = age
}
const p = new Person('彪哥', 18)
console.log(p.__proto__ === Person.prototype);

 

 规则五:

5.当试图得到一个对象的某个属性时,如果这个对象没有这个属性,就会去它的__proto__去找


__proto__隐式原型

1.所有的对象都有__proto__(隐式原型),属性值是一个对象(原型对象)

 2.所有对象的__proto__(隐式原型)指向它的构造函数的prototype(显示原型)

 3.因为函数也是属于对象的,所以函数也有__proto__属性

 function Star(name, age) {
            this.name = name
            this.age = age
        }
        Star.prototype.sing = function () {
            console.log('唱跳')
        }
        const bg = new Star('彪哥')
        console.log(bg)

   console.dir(Star)
        console.log(bg.__proto__ === Star.prototype)

__proto__的作用:

它相当于一个桥梁,实列通过__proto__就可以访问到他的原型对象


constructor属性:

每个原型(对象)都有一个constructor属性 ,指回构造函数本身

constructor在哪里:

1.bg.__proto__ ===>找到原型

2.Star.prototype ===>找到原型

这个属性就在原型上(对象上)


原型链:

 每个对象通过__proto__属性都能访问到它的原型链,原型对象也有它的原型对象

  当访问一个对象的属性和方法时,先在自生中寻找

   如果没有 ,就会沿着__proto__这条链,向上寻找。一直找到顶层object.prototype为止

 

       Object.prototype.__proto__ === null

 

数组的原型链:

 const arr = [1, 2, 3] //new Array()
        // 数组也是一个对象,它由Array这个构造函数创建出来的
        console.log(arr__ptoto__ === Array.prototype);
        // arr --->Array.prototype --->Object.prototype --->null

 

 函数的原型链:

 const fn = function () { }

        // 函数也是一个对象,它是由Function构造函数创建
        // fn-- -> Function.prototype-- -> Object.prototype-- -> null

可能到现在,有的小伙伴还不是很懂,下面我们直接上图:

 

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值