继承
2015-08-18 17:21
134 查看
什么是原型链
ECMAScript中,每个由构造器创建的对象都拥有一个指向构造器prototype属性值的隐式引用,这个引用称为原型(prototype)。
每个原型也可以拥有指向自己原型的隐式引用(即该原型的原型),如此下去,就是所谓的原型链(prototype chain),在具体的语言实现中,每个对象都有一个__proto__属性来实现对原型的隐式引用。
理解了原型链,便可以实现继承。ECMAScript规定,当要给某个对象的属性赋值时,解释器会查找该对象原型链中第一个含有该属性的对象(原型本身就是一个对象,那么原型链即为一组对象的链。对象的原型链中的第一个对象是该对象本身)。如果要获取某个对象属性的值,解释器会返回该对象原型链中首先具有该属性的对象属性值。如图:
原型链中的属性隐藏机制
图中,object1、prototype1、prototype2构成了对象object1的原型链。因为在object1中已经找到了prototype4属性,所以prototype1的prototype4属性被隐藏。同理,在prototype1中找到了prototype3属性,所以prototype2中的prototype3属性也被隐藏。
利用原型链实现继承
参考文章:http://www.ibm.com/developerworks/cn/web/1304_zengyz_jsoo/
ECMAScript中,每个由构造器创建的对象都拥有一个指向构造器prototype属性值的隐式引用,这个引用称为原型(prototype)。
每个原型也可以拥有指向自己原型的隐式引用(即该原型的原型),如此下去,就是所谓的原型链(prototype chain),在具体的语言实现中,每个对象都有一个__proto__属性来实现对原型的隐式引用。
理解了原型链,便可以实现继承。ECMAScript规定,当要给某个对象的属性赋值时,解释器会查找该对象原型链中第一个含有该属性的对象(原型本身就是一个对象,那么原型链即为一组对象的链。对象的原型链中的第一个对象是该对象本身)。如果要获取某个对象属性的值,解释器会返回该对象原型链中首先具有该属性的对象属性值。如图:
原型链中的属性隐藏机制
图中,object1、prototype1、prototype2构成了对象object1的原型链。因为在object1中已经找到了prototype4属性,所以prototype1的prototype4属性被隐藏。同理,在prototype1中找到了prototype3属性,所以prototype2中的prototype3属性也被隐藏。
利用原型链实现继承
//声明Animal对象构造器 function Animal () {}; //将Animal的prototype属性指向一个对象; //亦可以理解为指定Animal对象的原型 Animal.prototype={ name:"mengmeng", weight:200, eat:function(){ alert("动物"); } } //声明Mammal对象构造器 function Mammal () { this.name = "哺乳动物"; } //指定Mammal对象的原型为一个Animal对象。 //实际上此处便是在创建Mammal对象和Animal对象之间的原型链 Mammal.prototype = new Animal(); //声明Horse对象构造器 function Horse (height,weight) { this.name = "horse"; this.height = height; this.weight = weight; } //将Horse对象的原型指定为一个Mammal对象,继续构建Horse与Mammal之间的原型链 Horse.prototype = new Mammal(); //重新指定eat方法,此方法将覆盖从Animal原型继承来的eat方法 Horse.prototype.eat=function () { alert("马"); } var horse = new Horse(100,300); horse.eat();//马 alert(horse.__proto__ == Horse.prototype);//true alert(horse.prototype.__proto__ == Mammal.prototype);//true alert(Mammal.prototype.__proto__ == Animal.prototype);//true
参考文章:http://www.ibm.com/developerworks/cn/web/1304_zengyz_jsoo/
相关文章推荐
- 根据包名开启一个应用
- EF 的 霸气配置
- ACM线性方程
- java web几种开发模式(转)
- CLI的wait子命令阻塞等待状态更新
- Scala开发入门指南
- HPU-1693-CZY的YY难题
- 第一篇原创博客
- pat之月饼问题
- js ajax请求
- 两个小工具
- iOS基础_C语言第一讲
- mysql的GROUP_CONCAT函数的用法
- 密码验证,密码强度正则表达式
- (转)利用libcurl和国内著名的两个物联网云端通讯的例程, ubuntu和openwrt下调试成功(四)
- ZOJ 2319 Beatuiful People(单调递增序列的变形)
- Android音频播放之SoundPool
- jsp页面之间传参用el表达式获取
- 对于VS中一些较严谨的(_s)函数如strcpy_s的第二个参数的问题
- redis启动脚本