原型被称为js的三座大山之一,对于我来说挺难理解,所以js的基础块学完了我也没整理学习,今天有时间来整理一下学习的笔记.
1.什么叫原型
在javascript中,函数可以有属性。 每个函数都有一个特殊的属性叫作原型(prototype) 。
2.从何引出这个疑问?
我们知道 JS 有对象,比如
var obj = { name: 'obj' } ;
obj.toString()
image.png
大家看到这里有没有疑问,我没对toString()进行赋值,已经有值,所以obj原来是不是已经有东西了呢?这就是我们今天需要讲的原型.
我们看看obj里面有什么
image.png
我们发现 console.dir(obj) 打出来的结果是:
- obj 本身有一个属性 name(这是我们给它加的)
- obj 还有一个属性叫做 proto(它是一个对象)
- obj.proto 有很多属性,包括 valueOf、toString、constructor 等
- obj.proto 其实也有一个叫做 proto 的属性(console.log 没有显示),值为 null
现在回到我们的问题:obj 为什么会拥有 toString 属性?
答案:
这跟 proto 有关.
我们在来看下面的打印结果
image.png
我们打印出来的东西可以看出里面也有toString(),所以我们可以看出obj有一个隐藏属性proto,里面储存了Object.prototype对象的地址 ,当obj.toString()当在这里面没找到就在Object.prototype里面找,所以找到了Object.prototype.toString().所以XXX.prototype存储了XXX对象的共有属性,这就是原型.
3.原型的三大公式和公理
3.1JS公式
对象._proto_ === 其构造函数的.prototype(js唯一的公式,可以套用)
3.2根公理
Object.prototype 是所有对象的(直接或间接)原型
加了一个直接或间接,所谓公理就是规定好的
3.3函数公理
所有函数都是由 Function 构造的
任何函数.__proto__ === Function.prototype
任意函数有 Object / Array / Function
4.根据前面的公式我们可以推出js的内存图
image.png本文为本人的原创文章,著作权归本人和饥人谷所有,转载务必注明来源.
网友评论