[置顶] ES5 中的面向对象编程前传 之 深刻理解原型链(prototype)
2016-08-21 00:38
246 查看
JavaScript 中的原型链是非常关键的概念,理解它是掌握整个 JavaScript 体系结构的关键,原型链不仅用于定义对象的公用方法,还用于实现继承体系。JavaScript 中的面向对象涉及的各种名字非常容易使人混淆,请记住一点,C++ 中类和对象的概念,对应于 JavaScript 中的对象和对象实例,这可能有点难以理解,暂时先记住吧。
建立空对象;
对象
在对象上调用函数。
结合例子:
以上的对象实例创建过程如下:
对象实例是特定函数 new 的结果 ,特定函数继承于 Function 对象, Function 对象继承于 Object,Object 继承于 null,是的你没有看错!因为 null 也是对象,可以通过
下次再讲定义类和继承 ??!!
原型与原型链
原型是一个对象,维持着对象的所有实例的公用方法,原型链自不必说,就是各级对象包含的原型构成的链,每个对象都有一个特殊的属性:__proto__,它是一个指针,指向父对象的原型(prototype),父对象还是有这个属性,指向父对象的父对象,就这样,一直延伸到处于金字塔顶端的
Object,而
Object也是对象,它指向了 null。
new 干了些什么
new 关键字用于创建对象实例,使用 function 关键字实现自定义函数,使用 new 关键字调用函数,执行结果返回一个对象实例。new 做这件事的过程如下,前两部维持继承体系,最后一步将 this 变量赋值给新对象,那么 this 所引用的属性和函数都传递给了新对象:建立空对象;
对象
_proto_属性指向函数的 prototype;
在对象上调用函数。
结合例子:
function Human (name, age) { this.name = name; this.age = age; this.getName = function () { return this.name; } } var tom = new Human('tom', 25);
以上的对象实例创建过程如下:
var tom = {};
tom._proto_ = Human.prototype;
Human.call(tom);
JS 内置原型链继承体系
注: 这里讲的是原型链的继承关系,并不是说 Function 是 Object 的下一级,只是在原型链方面这么说。Function 和 Object,以及其他 JavaScript 内置对象之间的关系,请看上一篇文章:ES5的面向对象编程实现 http://blog.csdn.net/qingyafan/article/details/52276792对象实例是特定函数 new 的结果 ,特定函数继承于 Function 对象, Function 对象继承于 Object,Object 继承于 null,是的你没有看错!因为 null 也是对象,可以通过
typeof null测试。这个继承体系是由原型链维持的,每个对象都有一个
__proto__(注意两头都是双下划线)属性指向父对象,最顶端的 Object 的
__proto__指向 null。图:
总结
你懂了原型链了吗?原型链就是对象的__proto__指针属性连接的对象继承链。既然 JavaScript 本身可以这么做,那为什么我们不可以这样做呢?我们也可以利用这种模式实现继承,但是这种继承只能继承父对象
prototype中的属性和方法,由各个实例共享,那你是不是突然想起我们上一篇文章讲的函数构造作用域?结合文章中 new 操作符的作用及其执行过程,我们可以使用“构造函数”实现对象中属性和方法的继承,结合这两种方法,就是我们在 JavaScript 中面向对象编程的常用模式!!
下次再讲定义类和继承 ??!!
相关文章推荐
- [置顶] ES5 中的面向对象编程前传 之 深刻理解函数
- 从__proto__和prototype来深入理解JS对象和原型链
- 彻底深刻理解js原型链之prototype,__proto__以及constructor(一)
- prototype 是什么东西,原型链的理解,什么时候用 prototype
- [置顶] 4000 2017-11-15 深刻理解堆栈及PUSH POP指令
- 深刻理解下js的prototype
- JavaScript的原型原型链的深刻理解及运用
- [置顶]F#学习之路(2) 深刻理解函数(上)
- 从__proto__和prototype来深入理解JS对象和原型链
- 学习总结--JS中__proto__和prototype的关系以及原型链的理解
- js.prototype最深刻的理解
- [置顶] 深入理解javascript原型和闭包(3)——prototype原型
- 04面向对象编程-01-创建对象 和 原型理解(prototype、__proto__)
- 深刻理解Java中的堆和栈
- javascript的prototype原理理解
- 深刻理解Linux进程间通信(IPC)
- Android:Layout_weight的深刻理解
- 个人对Spring @Scope("prototype")的一些理解
- 开源框架spring详解-----AOP的深刻理解
- 深刻理解 React (一) ——JSX和虚拟DOM