JS中的破若头

JS中的破若头是学习高阶JS只是一道跨不过去的坎,今天我们就深入聊聊JS的破若头:即__proto__prototype。【以下为个人理解的总结,若有错误,请怼过来】。

First of all : 在破若头的世界里,有几个定理特别的重要,这几个定理就好比万有引力定理一般,可以更好的让我们理解破若头,如果你对破若头理解很深入,不妨看一下这几个定理是否正确。如果你也跟我一样对破若头一知半解,那么下面的几个定理你不一定要马上理解,但是最后你一定要牢记在心,相信在循序渐进的学习过程中,于你而言一定会有所帮助。

破若头定理

定理一:所有的引用数据类型(数组、对象、函数)[下同],都具有对象的特性:即可以自己扩展属性(除了"null"之外)。
定理二:【所有的引用数据类型】,都有一个__proto__属性,属性值是一个普通的对象。
定理三:【所有的函数】,都有一个prototype属性,属性值也是一个普通的对象。
定理四:【所有的引用数据类型】的__proto__属性指向它的构造函数的prototype属性值。
定理五:当试图得到一个对象的某个属性时,如果这个对象本身没有这个属性,那么会去它的__proto__(即它的构造函数的prototype)中寻找。(原型链)

在进入破若头实例之前,【有一点很重要】:
Javascript中所有的对象都是Object的实例,并继承Object.prototype的属性和方法,也就是说:Object.prototype是所有对象的父亲。
tip:在 js 中 Object 是一个构造函数

实例

根据定理二和定理三我们知道:
在对象创建时,就会有一些预定义好的属性:

  • 定义函数时:预定义好的属性就是prototype属性

  • 定义普通对象时:预定义好的属性就是_proto__

    function A(a){
        this.a = a
     }
    console.log(A.prototype)
    //constructor: ƒ A(a)
     //__proto__: Object
    

首先第一步,从定理三,我们可以知道打印A.prototype这个对象,然后根据定理二,A.prototype__proto__属性,且指向的是他的构造函数的prototype。然后根据我们刚才说的有一点很重要:这里的函数A的prototype的构造函数指的就是Object.prototype.
也就是说:A.prototype.__proto==Object.prototype

接着我们用一个实例对象来说明一下原型:

 function B(b){
     this.b = b
 }
 var b=new B('六个周')

当我们声明函数B的时候,自动创建了prototype属性,而B的实例b是个对象,那么b对象也就有了__proto__属性,b对象的破若头属性指向他的构造函数B的破若头type属性,即:
(b.__proto__==B.prototype)答案为true;

今天的破若头就先学这么一点,千里之行始于足下,日积月累,就这样吧

转载于:https://www.jianshu.com/p/ff2fe9d74cb9

猜你喜欢

转载自blog.csdn.net/weixin_34049948/article/details/91109212