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

原文: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.

初学JavaScript之推測new操作符的原理的更多相关文章

  1. 初学JavaScript七大注意事项

    知识说明: 初学JavaScript,注意以下七大细节,在实现同样功能的情况下,让我们的代码更易懂.效率更高. 一.简化代码 例如:创建对象 之前是这样的: Var car = new object( ...

  2. cocos2d-3.0 Helloworld::onTouchMoved的处理机制的推測

    bool sign2 = true; bool sign2 = true; void GameLayer::onTouchMoved(Touch *touch, Event *unused){ if( ...

  3. 每天一个JavaScript实例-检測表单数据

    <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...

  4. Javascript自执行匿名函数(function() { })()的原理浅析

    匿名函数就是没有函数名的函数.这篇文章主要介绍了Javascript自执行匿名函数(function() { })()的原理浅析的相关资料,需要的朋友可以参考下 函数是JavaScript中最灵活的一 ...

  5. JavaScript中Object.prototype.toString方法的原理

    在JavaScript中,想要判断某个对象值属于哪种内置类型,最靠谱的做法就是通过Object.prototype.toString方法. ? 1 2 var arr = []; console.lo ...

  6. Javascript的变量与delete操作符

    原文:http://charlee.li/javascript-variables-and-delete-operator.html 刚刚看到一篇好文(原文链接), 对Javascript中的dele ...

  7. javascript中!=、!==、==、===操作符总结

    JavaScript 有两种比较方式:严格比较运算符和转换类型比较运算符. 在相等运算符中对应 === .!==和 ==.!=. 先举个栗子 var str = '1' var num0 = 0 va ...

  8. 点滴的积累---初学Javascript

    在学习知识的路上,我们须要的不断的去接触新的知识,同一时候我们也不要不停地对自己旧的知识进行总结.近期通过<牛腩Javascript>和姜昊的<Javascript专题视频>对 ...

  9. javascript中的递增递减操作符

    javascript中递增递减属于一元操作符,所谓一元操作符,即只能操作一个值的操作符. 递增和递减操作符各有两个版本:前置型和后置型.顾名思义,前置型应该位于要操作的变量之前,而后置型应该位于要操作 ...

随机推荐

  1. luogu3953 逛公园

    正解:SPFA+DP 将POJ3463中maxDist(Target)由minDist(Target)+1改为minDist(Target+K)即可.判断0环,需要对每个节点建立下标为maxDist- ...

  2. oc17--点语法

    // // Person.h // day13 #import <Foundation/Foundation.h> @interface Person : NSObject { // @p ...

  3. 读懂diff【转】

    本文转载自:http://www.ruanyifeng.com/blog/2012/08/how_to_read_diff.html 读懂diff   作者: 阮一峰 日期: 2012年8月29日 d ...

  4. (hdoj 5137 floyd)How Many Maos Does the Guanxi Worth

    How Many Maos Does the Guanxi Worth Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 512000/5 ...

  5. Nginx中的root&alias文件路径及索引目录配置详解

    这篇文章主要介绍了Nginx中的root&alias文件路径及索引目录配置,顺带讲解了root和alias命令的用法,需要的朋友可以参考下     root&alias文件路径配置ng ...

  6. MAVEN 杂记

    MAVEN中央仓库 http://repo.maven.apache.org/maven2http://repo1.maven.org/maven2/http://mvnrepository.com/ ...

  7. Hadoop MapReduce编程 API入门系列之wordcount版本1(五)

    这个很简单哈,编程的版本很多种. 代码版本1 package zhouls.bigdata.myMapReduce.wordcount5; import java.io.IOException; im ...

  8. CSS简单入门

    - Java攻城狮学习路线 - 一. 什么是CSS CSS指层叠样式表(Cascading Style Sheets),定义如何显示HTML元素 二. CSS语法 /* 选择器 { 声明: 声明:}* ...

  9. Android高效加载大图

    通过BitmapFactory的decode方法设置特定的options缩小图片到指定尺寸 1:通过加载设置了只编码图片边界options的图片,获取原图的尺寸和类型 2:计算图片需要缩小的倍数 3: ...

  10. MeayunDB学习笔记(一) MeayunDB介绍及安装

    系列目录   MeayunDB介绍-高性能分布式内存数据库 MeayunDB学习笔记(一)MeayunDB介绍及安装 MeayunDB学习笔记(二)批量导入数据 MeayunDB学习笔记(三)索引应用 ...