javascript高级:原型与继承
原型继承的本质就是一条原型链,对象会沿着这条链,访问链里的方法属性.
对象的__proto__属性就是用于访问它的原型链的上一层:
考虑以下对象:
1. 所有对象的原型:
Object.prototype
2. 所有函数的原型:
Function.ptototype
3. 函数的构造函数:
Function
4. 对象的构造函数:
Object
5. 自定义的构造函数Person:
function Person(){
this.name=function(){};
this.init=function(){alert('我是Person对象的方法')};
}
6. 自定义构造函数Person的原型Person.prototype:
Person.prototype.init=function(){alert('我是Person原型的方法')}
7. 通过Person实例化得到的对象person:
var person = new Person();
person.init=function(){alert('我是person私有的方法')}
8. 通过Object实例化得到的对象object:
var object = new Object();
* 注意: var object = {},一样也是通过Object实例化得到的对象
他们之间的继承关系如下:
从最外层的开始看起,如果要访问person实例的某个方法属性,它寻找的顺序应该是这样的:
完整代码:
Object.prototype.init=function(){alert('我是对象的原型的方法')}; function Person(){ this.name=function(){}; this.init=function(){alert('我是Person对象的方法')}; } Person.prototype.init=function(){alert('我是Person原型的方法')} var person = new Person(); person.init=function(){alert('我是person私有的方法')} var object = new Object();
person.init();
首先寻找person的私有方法:
--也就是这里的person.init;
如果找不到,会找到Person的对象的方法:
--也就是这里的Person构造函数里的的this.init;
如果再找不到,它就会到原型链里去找方法:
person的原型链,就是person.__proto__,这里就是指向Person.prototype
因为,顺着原型链,首先会找到Person原型的方法:
--也就是这里的Person.prototype.init;
如果再找不到,它会顺着原型链继续找,也就是Person.prototype.__proto__,就是指向Object.prototype
--也就是这里的Object.prototype.init;
如果再找不到,那么就没有了,因为Object.prototype.__proto__指向null
所以,在js里,一切皆对象,因为所有的对象通过原型链,最后都会继承Object.prototype里的方法和属性,比如toString...等等...
再来看Person构造函数,Function构造函数,Object构造函数:
这三个都属于构造函数对象,通过他们可以new 一个对象,他们本身的__proto__都是Function.prototype,所以他们都继承了Function所有用的方法,比如bind(),apply()...等...
同样,示例中虽然没有提到,但是相似的,所有的内置构造函数,他们的__proto__也都是Function.prototype:
Boolean.__proto__ === Function.prototype // true
String.__proto__ === Function.prototype // true
Object.__proto__ === Function.prototype // true
Function.__proto__ === Function.prototype // true
Array.__proto__ === Function.prototype // true
RegExp.__proto__ === Function.prototype // true
Error.__proto__ === Function.prototype // true
Date.__proto__ === Function.prototype // true
Math.__proto__ === Object.prototype // true
JSON.__proto__ === Object.prototype // true
至于constructor,具体查阅上一篇文章:
http://www.cnblogs.com/liulangmao/p/3467863.html
最新文章
- android setting 设置永不休眠
- yeoman运行grunt serve 提示错误
- Uploadify 3.2使用
- cf Perfect Pair
- js_day14
- 在PHP中如何连接到数据库
- ASP.NET Web API的消息处理管道: HttpRoutingDispatcher
- Servlet第七篇【Cookie和Session的区别、应用】
- Java 8 特性 —— Stream
- IDEA鼠标显示javadoc的设置
- XShell停止滚屏,禁止滚动
- ElasticSearch权威指南学习(分布式集群)
- Java设计模式之四 ----- 适配器模式和桥接模式
- Xamarin开发的一个简单画图程序分享
- 常见的MySQL Replication Error
- go 数据类型type尝试
- LaTeX技巧:如何高效地将LaTeX代码转为Word公式
- JAVA框架之Hibernate【配置文件详解】
- javascript基础拾遗(九)
- 五、standalone运行模式
热门文章
- Java 类型, Hibernate 映射类型及 SQL 类型之间的相应关系
- mac系统下ionic环境配置
- 解决this web application instance has been stopped already
- 安装调试Installing Odoo
- visudo精确用户赋权(sudo)
- [Python]网络爬虫(九):百度贴吧的网络爬虫(v0.4)源码及解析
- 【转】Asp.Net MVC4 之Url路由
- /lib/ld-linux.so.2: bad ELF interpreter: No such file or directory 错误:
- Linux安装SQLite轻量级数据库
- Asp.Net中using的使用的方法(转)