哇好久都没有写随笔啦,整个人都慵懒啦。 为了不让大家忘记我,把以前写过的一些慢慢发出来。
在JS 中, 有两条链子,作用域链 和 原型链. 作用域链相对容易理解,两点
好了,开始看看原型链吧 .
在我之前的一些随笔,JavaScript使用构造函数获取变量的类型名涉及了一些关于 Javascript 原型的东西,这里关于原型就不啰嗦了 .
在 Javascript 中, 每一个对象 o 都具有 __proto__
属性(这个属性在IE9 以下没有暴露出来),被称为原型 ,根据属性搜索原则
对象 o 可以通过.
或者读取原型的属性,但是当写入时,不会在原型上修改属性,而是直接在对象 o 上添加.
当然,原型也是对象,原型也有__proto__
属性, 子子孙孙无穷尽也 ~~~
真的是无穷尽吗,当然不是 !
var obj = {a: 'pawn'};
上面通过对象字面值的方式申明了一个对象 obj
,并且拥有属性 a .
由于 o.__proto__ === Object.prototype
,那么可以认为这种方式等价于
var obj = new Object({a: 10});
所以,o 是继承自 Object.prototype
,但Object.prototype
也是对象,它继承自什么呢?
好吧,它继承自 null , 万剑归宗。
好了,现在找到了原型链的第一条子链
我们在来看 function
var func = function {}
通过字面值声明一个function
同理
func
继承自Function.prototype
,那Function.prototype
也是对象,它继承自什么呢?
可以看到,Function.prototype
继承自Object.prototype
,这也就回到了上一条链子.
好了,那现在引入一个问题,Function
本身也是函数,那Function
继承自哪呢? 当然是Function.prototype
,所以JS中最乱伦的东西出现了,Function
是自己的老子,即
那 Object
也是函数,Object
也当然继承自Function.prototype
.
好了,这就是所有原型链的东西
看起来好像很乱,盗 JK老师 一张图, 详细说明这个问题
现在做一个总结
Function.prototype
Function
Object
Function.prototype
Object.prototype
Function.prototype.__proto__ === Object.prototype
Object.prototype
看完了原型链,再看原型继承就简单了
var ProtoHerite = function(source) { var o = {}; if(o.__proto__){ o.__proto__ = source; return o; } var F = function {}; F.prototype = source; return new F; }
这个函数返回的对象原型继承自 source
,这也是Object.create(source)
实现思路.
如果觉得图画的还可以,其实我原来是学美术的 .
如果有错,望不吝赐教