哇好久都没有写随笔啦, 整个人都慵懒啦。
为了不让大家忘记我,把以前写过的一些慢慢发出来。
在 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 老师 一张图, 详细说明这个问题
现在做一个总结
看完了原型链, 再看原型继承就简单了
- 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) 实现思路.
如果觉得图画的还可以, 其实我原来是学美术的 .
来源: http://www.open-open.com/lib/view/open1488787842379.html