new运算符 能根据需求来创建对象的实例 通过与构造函数和一系列初始化过程中使用的可选参数来创建对象的实例,对象创建完成后,新创建的对象继承自构造函数的原型

        function Person(name) {
this.name = name;
}
Person.prototype.say = function() {
return this.name;
}
var person = new Person("haha");
console.log(person.say()); //haha

上面是我们比较常用的使用new + 构造函数的场景  让我们看看new 在这里面都做了什么

(1)创建了一个对象字面量{}

(2)将新创建的对象的构造函数链接到函数person上  也就是绑定this     通过查看person.constructor就能看出来 执行构造函数  这样就将构造函数上创建的属性和方法添加到新创建的对象上了

(3)将新创建对象的原型链接到构造函数的prototype上

(4)根据传入的参数,对对象的属性进行赋值  返回创建的对象 this

也就是我们可以这样的理解上面这个过程

        var person = {};  //创建一个空的对象
person.__proto__ = Person.prototype; //继承构造函数的原型
person.name = "haha"; //根据传入的参数实例化属性
console.log(person.say()); //'haha'

上面模拟new + 构造函数的模式

有几个需要注意的问题

当我们继承了构造函数的原型对象的时候 你仍然可以通过在构造函数的原型对象上添加属性和方法

        function Person(name) {
this.name = name;
}
Person.prototype.say = function() {
return this.name;
} var person = new Person("haha");
console.log(person.say());//haha
Person.prototype.test = 1;
console.log(person.test);//1

注意这里是一种浅拷贝 当我们修改试图修改构造函数原型上的属性的时候,其实是在相应的对象上新创建了一个属性,覆盖了原型对象上的属性,并且当我们删除自身的属性的时候,仍然访问到构造函数原型的属性

        var person1 = new Person("1");
var person2 = new Person("2");
Person.prototype.test = [1,2]; //在构造函数的原型对象上添加属性
console.log(person1.test); //[1,2] person1.test = [1,2,3];  
console.log(person1.test);//[1,2,3] 访问的是对象自身的test属性
console.log(person1.__proto__.test); // [1,2] 访问够构造函数原型的test属性
console.log(person2.test); //[1,2] 构造函数原型的test属性
delete person1.test;
console.log(person1.test); // [1,2] 删除自身test的属性 就恢复了对构造函数原型对象的属性的访问 (原型链的查找)

如果我们在这样使用一个构造函数呢  var person = Person()

这是执行构造函数的this执行的就不是我们新创建的构造函数了 而是window 创建的属性也是在windwo上   具体的解释请看我的另一篇文章

http://www.cnblogs.com/tiantianwaigong/p/4543428.html  面试遇到的问题的第四题

最近又看了园内博友的一篇文章  http://www.cnblogs.com/xxcanghai/p/5189353.html   里面涉及都new的优先级的问题  大家可以去好好了解下

new 小记的更多相关文章

  1. [原]Paste.deploy 与 WSGI, keystone 小记

    Paste.deploy 与 WSGI, keystone 小记 名词解释: Paste.deploy 是一个WSGI工具包,用于更方便的管理WSGI应用, 可以通过配置文件,将WSGI应用加载起来. ...

  2. MySql 小记

    MySql  简单 小记 以备查看 1.sql概述 1.什么是sql? 2.sql发展过程? 3.sql标准与方言的关系? 4.常用数据库? 5.MySql数据库安装? 2.关键概念 表结构----- ...

  3. Git小记

    Git简~介 Git是一个分布式版本控制系统,其他的版本控制系统我只用过SVN,但用的时间不长.大家都知道,分布式的好处多多,而且分布式已经包含了集中式的几乎所有功能.Linus创造Git的传奇经历就 ...

  4. 广州PostgreSQL用户会技术交流会小记 2015-9-19

    广州PostgreSQL用户会技术交流会小记 2015-9-19 今天去了广州PostgreSQL用户会组织的技术交流会 分别有两个session 第一个讲师介绍了他公司使用PostgreSQL-X2 ...

  5. 东哥读书小记 之 《MacTalk人生元编程》

         一直以来的自我感觉:自己是个记性偏弱的人.反正从小读书就喜欢做笔记(可自己的字写得巨丑无比,尼玛不科学呀),抄书这事儿真的就常发生俺的身上. 因为那时经常要背诵课文之类,反正为了怕自己忘记, ...

  6. Paypal支付小记

    Paypal支付小记 *:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: 0 !impo ...

  7. linux 下cmake 编译 ,调用,调试 poco 1.6.0 小记

    上篇文章 小记了: 关于 Poco::TCPServer框架 (windows 下使用的是 select模型) 学习笔记. http://www.cnblogs.com/bleachli/p/4352 ...

  8. mongodb入门学习小记

    Mongodb 简单入门(个人学习小记) 1.安装并注册成服务:(示例) E:\DevTools\mongodb3.2.6\bin>mongod.exe --bind_ip 127.0.0.1 ...

  9. 【日常小记】统计后缀名为.cc、.c、.h的文件数【转】

    转自:http://www.cnblogs.com/skynet/archive/2011/03/29/1998970.html 在项目开发时,有时候想知道源码文件中有多少后缀名为.cc..c..h的 ...

  10. ulua 路径小记 以及 lua require 机制整理

    ulua 路径小记 在学习ulua时,require模块的根路径可以为项目的Lua文件夹或者ToLua文件夹(Editor下),但是在package.path和package.cpath中并没有看到当 ...

随机推荐

  1. tcp/ip协议listen函数中backlog参数的含义与php-fpm的502 Bad Gateway

    To understand the backlog argument, we must realize that for a given listening socket, the kernel ma ...

  2. 六款值得推荐的android(安卓)开源框架

    1.volley 项目地址 https://github.com/smanikandan14/Volley-demo (1)  JSON,图像等的异步下载: (2)  网络请求的排序(scheduli ...

  3. 读书笔记_Effective_C++_条款四十六:需要类型转换时请为模板定义非成员函数

    这个条款可以看成是条款24的续集,我们先简单回顾一下条款24,它说了为什么类似于operator *这样的重载运算符要定义成非成员函数(是为了保证混合乘法2*SomeRational或者SomeRat ...

  4. VPN理论简单介绍(转载)

    标签:VPN理论简单介绍 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://lvnian.blog.51cto.com/715528 ...

  5. 【eoe 6】ActionBar的使用

    一. Action Bar 一般位于屏幕顶部,包括四个可操作区域: 应用图标或LOGO区域,用于视图控制的Spinner下拉菜单或TAB控件区域, Action button(也称为Action It ...

  6. libtool: link: `dftables.lo' is not a valid libtool object

    手误造成的错误: make & make install.&位操作符导致的错误!应该是make && make install.

  7. Node.js建站笔记-使用react和react-router取代Backbone

    斟酌之后,决定在<嗨猫>项目中引入react,整体项目偏重spa模式,舍弃部分server端的模板渲染,将一部分渲染工作交给前端react实现. react拥有丰富的组件,虽然不如Back ...

  8. [pyhton]python内建方法

    撸一遍python的内建方法 这样做的好处就是:我如果要完成一个功能的时候,如果能用内建方法完成,就用内建方法.这样可以提高效率,同时使自己的代码更加优雅.哎呦?那岂不是撸完就是python高手了?我 ...

  9. js中this的四种调用模式

    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/ ...

  10. 参数嗅探(Parameter Sniffing)(2/2)

    在参数嗅探(Parameter Sniffing)(1/2)里,我介绍了SQL Server里参数嗅探的基本概念和背后的问题.如你所见,当缓存的计划被SQL Server盲目重用时,会带来严重的性能问 ...