二. 原型对象
   在JavaScript 中,每当定义一个对象(函数)时候,对象中都会包含一些预定义的属性。其中函数对象的一个属性就是原型对象 prototype。注:普通对象没有prototype,但有__proto__属性。

  原型对象其实就是普通对象(Function.prototype除外,它是函数对象,但它很特殊,他没有prototype属性(前面说道函数对象都有prototype属性))。看下面的例子:
 function f1(){};
 console.log(f1.prototype) //f1{}
 console.log(typeof f1. prototype) //Object
 console.log(typeof Function.prototype) // Function,这个特殊
 console.log(typeof Object.prototype) // Object
 console.log(typeof Function.prototype.prototype) //undefined

 从这句console.log(f1.prototype) //f1 {} 的输出就结果可以看出,f1.prototype就是f1的一个实例对象。就是在f1创建的时候,创建了一个它的实例对象并赋值给它的prototype,基本过程如下:
 var temp = new f1();
 f1. prototype = temp;

  所以,Function.prototype为什么是函数对象就迎刃而解了,上文提到凡是new Function ()产生的对象都是函数对象,所以temp1是函数对象。
 var temp1 = new Function ();
 Function.prototype = temp1;

那原型对象是用来做什么的呢?主要作用是用于继承。举了例子:
  var person = function(name){
   this.name = name
  };
  person.prototype.getName = function(){
     return this.name; 
  }
  var zjh = new person(‘zhangjiahao’);
  zjh.getName(); //zhangjiahao

   从这个例子可以看出,通过给person.prototype设置了一个函数对象的属性,那有person实例(例中:zjh)出来的普通对象就继承了这个属性。具体是怎么实现的继承,就要讲到下面的原型链了。

三.原型链
   JS在创建对象(不论是普通对象还是函数对象)的时候,都有一个叫做__proto__的内置属性,用于指向创建它的函数对象的原型对象prototype。以上面的例子为例:

  console.log(zjh.__proto__ === person.prototype) //true

同样,person.prototype对象也有__proto__属性,它指向创建它的函数对象(Object)的prototype

  console.log(person.prototype.__proto__ === Object.prototype) //true

继续,Object.prototype对象也有__proto__属性,但它比较特殊,为null

  console.log(Object.prototype.__proto__) //null

我们把这个有__proto__串起来的直到Object.prototype.__proto__为null的链叫做原型链。如下图:

五.constructor
  原型对象prototype中都有个预定义的constructor属性,用来引用它的函数对象。这是一种循环引用
  person.prototype.constructor === person //true
  Function.prototype.constructor === Function //true
  Object.prototype.constructor === Object //true

最新文章

  1. 强制浏览器使用兼容模式,Web.config,httpProtocol
  2. 从一个前端项目实践 Git flow 的流程与参考
  3. 更改css element.style
  4. Android中用Application类实现全局变量
  5. 将excel的.xlsx文件转成数据库文件.db的方法
  6. 将258.369 double值转为内存表示(科学计数法)
  7. [LeetCode235]Lowest Common Ancestor of a Binary Search Tree
  8. c3p0获取连接Connection后的Close()---释疑
  9. 解决ubuntu常见问题
  10. 常见XML解析器
  11. 后端编程语言PHP
  12. chrome插件控制台
  13. redis基础之基本键值操作和使用(三)
  14. Oracle自定义聚集函数
  15. hdu2149Public Sale(巴什博弈)
  16. 安装 SQL Server 2014 Express
  17. 学习Tomcat动态加载JSP的Class类
  18. windows下在指定目录下打开命令行
  19. pig常用命令
  20. 最新国内外可用SVN托管仓库有哪些

热门文章

  1. 标签navtab
  2. jsCodeWar 多函数嵌套调用
  3. struts2常见配置
  4. ESXi cron jobs
  5. Palindrome_滚动数组&&DP
  6. 拆解cytom!c's 的keyFile保护
  7. CodeForces 414D (贪心)
  8. Unity3D ShaderLab 漫反射卷积光照模型
  9. 使用Inno Setup 打包.NET程序,并自动安装.Net Framework
  10. 【转发】构建高可伸缩性的WEB交互式系统(上)