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