本文是一篇原理推測的文章,假设有不准确的地方请指正,

原文:http://blog.csdn.net/softmanfly/article/details/34833931

JavaScript中构造函数与普通函数事实上没有什么区别,构造函数能够当做普通函数来使用,普通函数也能够用new来模拟构造函数的调用。然而使普通函数与构造函数发生区别的事实上就在于new操作符的内部原理。以下是我通过測试推測的new操作符的运行过程,当你在用new操作符来生成一个对象时内部可能运行了以下几个步骤的操作:

以构造函数

function Person(name){

this.name = name

this.sayName = function() {

alert(this.name);

}

}

来举例说明:

(1) 新建一个对象 var object = {};

(2) 然后设置构造函数的作用域为object,这样就能使用this指针,详细的操作可能是这种:

Person.apply(object。name);

(3) 运行构造函数中的详细代码,因为上一步apply使用的作用域是object,所以当运行this.name = name时事实上运行器先是去寻找object中有没有name属性。没有name属性就加入一个name属性,并为他赋值。

(4) 返回这个创建的object;

var p = new Person("cat");

window.sayName = p.sayName;

window.sayName();

终于事实上输出的是undefined为什么呢?

由于 假设未对函数进行this指针重定向操作的话(三种方式:object.sayName, sayName.apply(object), var object = new Person()),那么这个函数在调用时所创建的运行上下文环境中的this指针默认指向的是window全局对象,所以当调用window.sayName时。要alert一个this.name,事实上就是在alert window.name,而window对象中没有name这个属性,所以就提示undefined。

假设你调用window.sayName = p.sayName.bind(p);然后再去调用window.sayName的话。输出就变成了cat,这是由于你把一个新的sayName对象(由于bind返回的是一个新的对象)的this指针绑定到了p对象上,即this指向p对象。当你再调用window.sayName()时搜索sayName函数对象的this指针就不再是window对象了,而是p。此时就直接输出了cat.

最新文章

  1. sql server 去除(替换)空格,回车,换行 函数
  2. Shader LOD
  3. cocos2d/x 自带字体(label)
  4. 玩转无线电 -- 温哥华天车 RFID 票务系统
  5. Python 的property的实现 .
  6. CSS3中渐变gradient详解
  7. 2D游戏编程6—windows程序模板
  8. thinkphp框架dump友好调试输出函数
  9. HDu -2844 Coins多重背包
  10. 【hihocoder#1388】Periodic Signal NTT
  11. HDU 5815 - Golden Week
  12. mimi
  13. windows 下 多版本nodejs切换 nvmw
  14. 7_SQL Server通过代码删除数据
  15. memcached subList序列化问题
  16. ogma
  17. poj1664放苹果(递归)
  18. 常见的Java面试题及答案整理
  19. Maven的默认中央仓库
  20. mysql 数据库简介

热门文章

  1. POJ1151 Atlantis 扫描线算法
  2. element-UI中table表格的row-click事件怎么获取一行数据的id
  3. CentOS6.8 安装 mysql 5.6
  4. 【概率证明】—— sum and product rules of probability
  5. Python多线程学习(一、线程的使用)
  6. 对JVM还有什么不懂的?一文章带你深入浅出JVM!
  7. c语言open()介绍
  8. java中的访问修饰符2
  9. P3808 【模版】AC自动机(简单版)
  10. List 常用方法解析