JS 原型链随笔(一)
一直在考虑,自己的第一篇随笔究竟该写点什么好。但是最后还是决定用一篇基础知识作为开头。
原型链的五条规则:
1.所有的引用类型(数组、对象、函数),都具有对象特性,即可以自由扩展属性(除了'null'外)。
2.所有的引用类型(数组、对象、函数),都有一个__proto__属性,属性值是一个普通的对象。
3.所有的函数,都有一个prototype属性,属性值也是一个普通的对象。
4.所有的引用类型(数组、对象、函数)的__proto__属性值指向它的构造函数的prototype属性。
5.当试图得到一个对象的某个属性时候,如果这个对象本身没有这个属性,那么会去它的__proto__属性中找。也就是向它的构造函数的'prototype'属性中寻找。
妈呀,听完这5条怎么感觉什么都没有记住。。。。。。下面就来一段白话文解释。
这里需要注意,所有引用类型都有一个构造函数,同时所有的函数都有一个prototype属性,给函数添加prototype属性是浏览器帮我们做的。当然构造函数也是函数的一部分,平时我们定义的普通函数也是函数,只是作为构造函数的函数名我们一般习惯首字母大写。
浏览器给引用类型扩展了一条属性__proto__(平时我们称之为隐式原型),这是可以理解的,因为本来引用类型就可以自由扩展属性,这个__proto__就是浏览器帮我们扩展的嘛。但是值得注意的是,这里的__proto__属性的指向,它指向该引用类型的构造函数的prototype(平时我们称之为显示原型)。
下面是我在chrome中测试的代码,前端环境就是这么方便,每次验证什么随便打开一个网页打开console就行了。
这段代码简单地验证了1,2,3,4,5条。
这里需要注意的两小点是,函数也是引用类型哈,所以也可以任意扩展属性。还有像{},[],function是引用类型,是引用类型就有构造函数,那么它们的构造函数是谁呢,就是js内置函数Object,Array,Function哈。
哇,这么快一页就满了,一个小时过去了。希望自己坚持,每天更新一小篇。
网友评论