作用

是创建一个对象实例。这个对象可以是用户自定义的,也可以是一些系统自带的带构造函数的对象。

描述

创建一个对象类型需要创建一个指定了名称和属性的函数;其中这些属性可以指向它本身,也可以指向其他对象,看下面的例子:

当代码 new hFive(…) 执行时:

一个新对象被创建。它继承自hFive.prototype.

构造函数 hFive() 被执行。执行的时候,相应的传参会被传入,同时上下文 this 会被指定为这个新实例。new hFive等同于 new hFive(), 只能用在不传递任何参数的情况。

如果构造函数返回了一个“对象”,那么这个对象会取代整个new出来的结果。如果构造函数没有返回对象,那么new出来的结果为步骤1创建的对象,ps:一般情况下构造函数不返回任何值,不过用户如果想覆盖这个返回值,可以自己选择返回一个普通对象来覆盖。当然,返回数组也会覆盖,因为数组也是对象。

任何情况下都可以对任意一个对象添加新的属性,比如 hFive.color = “black” 这句代码给hFive添加了一个新的属性color , 然后给这个属性赋值 “black”。然而,这个操作不会影响任何其他对象。

如果想给所有同样类型的对象添加属性,你需要给hFive这个对象类型来添加属性。你可以通过给 hFive.prototype 添加属性的方式来给所有先前定义的实例来添加属性。这种定义属性的方式会影响到所有通过new构造函数创建的对象,因为它们共享了这个对象类型。

举例

(以函数hFive为例说明)

1.通过” . “的方式给hFive添加的方法或属性,使用new关键字实例的对象不会继承,但是hFive本身可以使用。

var hFive=function(){
this.name="默@语";
this.url="h-five.com";
this.says=function(){
alert("hello guys! here is MoYu. Welcome to herer");
}
} hFive.other=function(){
alert("是通过' . '添加的方法。");
} var c=new hFive();
c.says();//hello guys! here is MoYu. Welcome to herer.
hFive.other();//是通过' . '添加的方法。
c.other();//c.others is not a function

2.通过原型链prototype添加的方法,使用new关键字实例的对象会继承,hFive自己不能使用。

var hFive=function(){
this.name="默@语";
this.url="h-five.com";
this.says=function(){
alert("hello guys! here is MoYu. Welcome to herer");
}
} hFive.prototype.other=function(){
alert("是通过' . '添加的方法。");
} var c=new hFive();
c.says();//hello guys! here is MoYu. Welcome to herer.
c.other();//是通过' . '添加的方法。
hFive.other();//hFive.other is not a function

瞎扯淡

直接使用hFive获取hFive内部的属性或者方法会出错,提示undefined或者hFive.says is not a function。因为此时hFive只是被赋值为一个函数(相当于只是声明了一样),并没有执行,所以会有上面的提示,当执行hFive()后,在直接使用hFive直接使用hFive获取hFive内部的属性或者方法同样会出错,因为此时hFive()执行的上下文是window,所以内部的this指代的是全局对象window,使用window.url或window.says()则不会报错;

东拉西扯

1.下面代码中f能否调用a()和b()方法

var F = function(){};
Object.prototype.a = function(){ console.log("O");};
Function.prototype.b = function(){console.log("F");};
var f = new F();
f.a();//0
f.b();//f.b is not a function
console.log(f instanceof Function);//false
console.log( typeof f);//true
F.b();//F

f只能调用a方法,不能调用b方法,因为通过new关键字创建的是一个对象实例 ,他是一个对象,所以它能继承Object.prototype,也就能使用a放法。通过Function.prototyp添加的方法能被所有的Function对象使用,所以f不能调用b方法,但是F能调用b方法,因为它是一个function对象,function对象继承Function.prototype,是Function的一个实例,所以它也是Function对象,也就能使用b方法。

2.下面代码,a的值是多少,b的只是多少。

var a = {n: 1};
var b = a;
a.x=a = {n: 2};
console.log(b.x);//Object {n: 2}
console.log(b);//Object {n: 1, x: Object}
console.log(a);//Object {n: 2}
console.log(a.x);//undefined

当代码执行到 a.x=a = {n: 2}; 时,赋值运算符会从右向左赋值,首先a = {n: 2},javascript会创建一个新的对象,并用a指向它,a原来的值被覆盖,执行完之后执行a.x=a,但此时a.x的a并不是=后面的a,a.x的a是以前的a,也就是b(因为之前a被复制给了b),所以最后结果如上所示。

参考文档

https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/new

https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Function

原创,转载请注明来源,默@语:www.h-five.com

JavaScript学习笔记–(new关键字)的更多相关文章

  1. JavaScript:学习笔记(4)——This关键字

    JavaScript:学习笔记(4)——This关键字 以前这篇帖子是关于闭包的,但是我想弄明白的其实是This关键字.JavaScript的this和Java等面向对象语言中的this大不一样,bi ...

  2. JavaScript:学习笔记(7)——VAR、LET、CONST三种变量声明的区别

    JavaScript:学习笔记(7)——VAR.LET.CONST三种变量声明的区别 ES2015(ES6)带来了许多闪亮的新功能,自2017年以来,许多JavaScript开发人员已经熟悉并开始使用 ...

  3. JavaScript:学习笔记(6)——New运算符

    JavaScript:学习笔记(6)——New运算符 new 运算符创建一个用户定义的对象类型的实例或具有构造函数的内置对象的实例. 快速开始 当你使用new关键字的时候,会 创建一个新的对象 将th ...

  4. JavaScript:学习笔记(5)——箭头函数=>以及实践

    JavaScript:学习笔记(5)——箭头函数=>以及实践 ES6标准新增了一种新的函数:Arrow Function(箭头函数).本文参考的链接如下: MDN箭头函数:https://dev ...

  5. Java程序猿的JavaScript学习笔记(汇总文件夹)

    最终完结了,历时半个月. 内容包含: JavaScript面向对象特性分析,JavaScript高手必经之路. jQuery源代码级解析. jQuery EasyUI源代码级解析. Java程序猿的J ...

  6. Java程序猿的JavaScript学习笔记(8——jQuery选择器)

    计划按例如以下顺序完毕这篇笔记: Java程序猿的JavaScript学习笔记(1--理念) Java程序猿的JavaScript学习笔记(2--属性复制和继承) Java程序猿的JavaScript ...

  7. Java程序猿JavaScript学习笔记(2——复制和继承财产)

    计划和完成在这个例子中,音符的以下序列: Java程序猿的JavaScript学习笔记(1--理念) Java程序猿的JavaScript学习笔记(2--属性复制和继承) Java程序猿的JavaSc ...

  8. Java程序猿的JavaScript学习笔记(3——this/call/apply)

    计划按例如以下顺序完毕这篇笔记: Java程序猿的JavaScript学习笔记(1--理念) Java程序猿的JavaScript学习笔记(2--属性复制和继承) Java程序猿的JavaScript ...

  9. Java程序猿JavaScript学习笔记(4——关闭/getter/setter)

    计划和完成这个例子中,音符的顺序如下: Java程序猿的JavaScript学习笔记(1--理念) Java程序猿的JavaScript学习笔记(2--属性复制和继承) Java程序猿的JavaScr ...

  10. Java程序猿JavaScript学习笔记(14——扩大jQuery UI)

    计划和完成这个例子中,音符的顺序如下: Java程序猿的JavaScript学习笔记(1--理念) Java程序猿的JavaScript学习笔记(2--属性复制和继承) Java程序猿的JavaScr ...

随机推荐

  1. POJ 3276 Face The Right Way 反转

    大致题意:有n头牛,有些牛朝正面,有些牛朝背面.现在你能一次性反转k头牛(区间[i,i+k-1]),求使所有的牛都朝前的最小的反转次数,以及此时最小的k值. 首先,区间反转的顺序对结果没有影响,并且, ...

  2. Java新集合

    对我来说,集合类属于最强大的一种工具,特别适合在原创编程中使用.大家可能已感觉到我对Java 1.1 提供的集合多少有点儿失望.因此,看到Java 1.2 对集合重新引起了正确的注意后,确实令人非常愉 ...

  3. 网上图书商城3--Book模块

    小技巧一:分页 ①PageBean<Book> findByCriteria(List<Expression> exprList, int pc)  --- 通用的查询方法(p ...

  4. [翻译]:SQL死锁-死锁排除

    As we already saw, the reasons why we have blocking issues and deadlocks in the system are pretty mu ...

  5. mesos 学习笔记1 -- mesos安装和配置

    参考资料: 官方文档:http://mesos.apache.org/documentation 中文翻译:http://mesos.mydoc.io/ GitHub:https://github.c ...

  6. Hibernate关联映射(单项多对一和一对多、双向一对多)

    最近总是接触着新的知识点来扩展自己的知识面:不停的让自己在原地接触天空的感觉真的很美好!!!革命没有成功,程序员的我们怎么能不努力呢...... 一.用员工和部门来剖析关联映射的原理. 1)从这张截图 ...

  7. (转)T-SQL查询处理执行顺序(一)

    对于T-SQL编程,用得最广泛的,莫过于查询(Querying).要想写出高质量.高性能的查询语句,必须深入地了解逻辑查询处理. 一.逻辑查询处理的各个阶段 (5)SELECT DISTINCT TO ...

  8. Code First :使用Entity. Framework编程(4) ----转发 收藏

    第4章 对关系使用默认规则与配置 在第3章,你已经掌握了默认规则与配置对属性以及其在数据库映射的字段的影响.在本章,我们把焦点放在类之间的关系上面.这包括类在内存如何关联,还有数据库中的外键维持等.你 ...

  9. ENVI【非监督分类】

    非监督分类的概念: 非监督分类,又称“聚类分析或者点群分析”.在多光谱图像中搜寻.定义其自然相似光谱集群的过程.它不必对图像地物获取先验知识,仅依靠图像上不同地物光谱信息进行特征提取,在统计特征的差别 ...

  10. Owl Carousel – 支持触摸的 jQuery 响应式传送带插件

    Owl Carousel 是一个 jQuery 插件,使我们能够迅速地创建响应式传送带滑块.这个插件是触摸友好的,能与几乎任何的 HTML 内容兼容使用.另外,强大的选项设置支持分页/滑动速度,启用/ ...