让我们谈谈js原型链和继承
来源:互联网 发布:淘宝网投诉电话 编辑:程序博客网 时间:2024/05/24 07:30
原型(prototype)在js中可是担当着举足轻重的作用,原型的实现则是在原型链的基础上,理解原型链的原理后,对原型的使用会更加自如,也能体会到js语言的魅力。
本文章会涉及的内容
- 原型及原型对象
- 原型链(JavaScript核心部分)
- 类的继承
- instanceof
- constructor
我们先用一个构造器来实现一个构造函数:
function A(){ this.mark = "A"; this.changeMark = function(){ this.mark += "_changed"; }}A.prototype.mark2 = "A2";A.prototype.changeMark2 = function(){ this.mark2 += "_changed";}var a = new A();var a2 = new A();//下面则说明构造函数实例化后,分配着不同的实例对象,互不相关console.log(a.mark); //"A"console.log(a2.mark); //"A" a.changeMark(); //使用实例对象中的方法console.log(a.mark); //"A_changed"console.log(a2.mark); //"A"//下面则说明了new操作符的一项作用,即将原型中的this指向当前对象,//在a.changeMark2执行时,changMark2中的方法先找 this.mark2 的值,//但是实例对象this中没有mark2值,则在原型链(后面会介绍)向上寻找,得到A原型对象中的mark2值,//在赋值时,将修改后的值添加在了a实例中。//总:虽然调用的是prototype方法,但是不会对prototype属性做修改,只会说是在实例中新增属性,但是在使用时,会最使用最近得到的属性(在后面原型链中可以加以理解)console.log(a.mark2); //"A2"console.log(a2.mark2); //"A2" a.changeMark2(); //使用原型链中的方法console.log(a.mark2); //"A2_changed"console.log(a2.mark2); //"A2"
为什么a可以使原型中的changeMark2方法?这就和js巧妙的原型链相关,在Firefox中我们可以打印出对象并可查看到对象下面的__proto__。
我们把上面的过程用流程图来表示:
只有构造函数才会有prototype属性,而实例化出来的对象会拥有__proto__,而不会有prototype。
就像上图画的那样,两个实例化的对象都通过__proto__属性指向了A.prototype(即构造函数的原型对象)
而原型对象的__proto__指向Object对象,就像a.toString()的toString方法就是存在于Object原型对象(Object.prototype)中。
so:当使用对象的方法或属性时,对象会在一步一步通过__proto__向上寻找,找到最近的则是最终的获取到的方法或属性。
————这就是js中的原型链。
就像图上看到的一样,所有对象的原型链最终都指向了Object对象,而Object的原型对象(Object.prototype)是为数不多的不继承自任何属性的对象,即Object.prototype没有__proto__,是原型链的顶峰。
0 0
- 让我们谈谈js原型链和继承
- Js中的原型继承和原型链
- 谈谈JS的核心技术:原型对象和原型链
- 谈谈JS的核心技术:原型对象和原型链
- 谈谈 Object.create ,JS的原型继承
- JS原型和继承
- Js 原型和继承
- js原型和继承
- js原型和继承
- JS继承--原型链继承和类式继承
- JS:原型、原型链、继承
- 小谈js原型链和继承
- 深入理解JS继承和原型链
- 【JS】原型链继承
- js原型链继承
- 对于js原型和原型链继承的简单理解(第一种,原型链继承)
- js继承 对象冒充和原型链继承
- js中的原型和继承
- gps 数据解析-NMEA 0183协议
- HDU 1058 Humble Numbers
- hdu 2542 补兵(二分,模拟)
- Eclipse上搭建SSH(struts-2.2.3 + spring-2.5.6 + hibernate-3.6.8)框架-附源码
- window xp的快速启动图标全部被更改为IE浏览器图标的解决办法
- 让我们谈谈js原型链和继承
- extern "c"用法解析
- Run Book Automation - RBA系统介绍
- 终于彻底理解了Nyquist bandwidth的本质
- c# substring的用法
- CEP和EDSOA的那些事
- 四大组件之Broadcast Receiver
- socket阻塞与非阻塞,同步与异步
- Android SDK Manager无法更新的解决