原型继承的本质就是一条原型链,对象会沿着这条链,访问链里的方法属性.

对象的__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对象和JSON对象,不是构造函数,他们的__prototype__是Object.prototype:
Math.__proto__ === Object.prototype  // true
JSON.__proto__ === Object.prototype // true

至于constructor,具体查阅上一篇文章:

http://www.cnblogs.com/liulangmao/p/3467863.html

最新文章

  1. android setting 设置永不休眠
  2. yeoman运行grunt serve 提示错误
  3. Uploadify 3.2使用
  4. cf Perfect Pair
  5. js_day14
  6. 在PHP中如何连接到数据库
  7. ASP.NET Web API的消息处理管道: HttpRoutingDispatcher
  8. Servlet第七篇【Cookie和Session的区别、应用】
  9. Java 8 特性 —— Stream
  10. IDEA鼠标显示javadoc的设置
  11. XShell停止滚屏,禁止滚动
  12. ElasticSearch权威指南学习(分布式集群)
  13. Java设计模式之四 ----- 适配器模式和桥接模式
  14. Xamarin开发的一个简单画图程序分享
  15. 常见的MySQL Replication Error
  16. go 数据类型type尝试
  17. LaTeX技巧:如何高效地将LaTeX代码转为Word公式
  18. JAVA框架之Hibernate【配置文件详解】
  19. javascript基础拾遗(九)
  20. 五、standalone运行模式

热门文章

  1. Java 类型, Hibernate 映射类型及 SQL 类型之间的相应关系
  2. mac系统下ionic环境配置
  3. 解决this web application instance has been stopped already
  4. 安装调试Installing Odoo
  5. visudo精确用户赋权(sudo)
  6. [Python]网络爬虫(九):百度贴吧的网络爬虫(v0.4)源码及解析
  7. 【转】Asp.Net MVC4 之Url路由
  8. /lib/ld-linux.so.2: bad ELF interpreter: No such file or directory 错误:
  9. Linux安装SQLite轻量级数据库
  10. Asp.Net中using的使用的方法(转)