一直以来都特别疑惑js原型链的只是,每次看到类似的文章也是迷迷糊糊,今天终于有点小的感悟,记录下来
在JS中一切都是对象,而通过其它的面向对象语言,对象又是类型的实例,所以类型和对象是不同的,那么在js里边是怎样的呢?
我们知道类型是可以被实例的,也就是类型可以使用new关键字,js中的类型有这些Array, Boolean, Date, Error, Function, Number, Object, RegExp, String
做实验可以发现,这些都是可以被成功实例化
如果将new关键字用在实例出来的对象伤,很明显会报错,不是一个构造器
而我们在做另一个实验
可以发现凡是类型都是有prototype属性的,反之对象的prototype属性是未定义
在控制台直接输入这些类型,打印出来的是一个function,那么其实可以理解为这些类型的本质都是函数,刚刚有说到类型全部都是可以被实例化的并且具有prototype属性,那么我们声明一个函数,实验
印证了我的观点,这些类型的本质都是函数,函数也可以当作一个类型。
我们都知道prototype就是原型的意思,那么也就是说只有类型才具有原型,那么这个原型到底是什么呢?
既然是原型,那么我们用最基本的字面意思来理解,就是它的本真,它的最原始的状态,我们尝试向Object的原型添加属性,可以发现,既可以直接被Object.找到也可以被Object的实例找到,用其它面向对象语言来理解就是通过prototype注册的属性既是静态属性也是非静态属性(这里用的Object类型,如果尝试其它类型例如Number,你会看到不一样的哦)。
但是注意到一点,如果直接通过Object来添加属性,如Object.C,那么C只能是通过Object.找到,而不能被Object的实例找到,理解为静态属性。
所以,prototype就是类型的原型,通过原型添加属性和方法(其实有些废话的,因为这个文章其实就是一个笔记,我目前只理解到这里)。
对了,还有__proto__属性,我们可以发现,不管对象还是类型都有__proto__属性,__proto__永远指向的都是它的父级元素,就跟一个链条一样我们永远可以通过__proto__找到它的父级的原型,
但是这也得有个尽头不是,总不可能一直指向指向虚无吧,做个实验发现,不管什么最终都会指向Object的原型,再找Object的原型的原型链呢,就返回了null,所以一切皆空啊。
夹杂了太多的个人理解,因为确实是控制台打印出来的例子,所以大的错误应该是没有的,但是肯定会有一些描述不准确或者是我自己理解的与真实的存在出入的地方,希望看到的朋友帮忙指出来。我也在继续学习原型链的知识,一步步理解它。