用构造函数创建对象时的this的指向问题
用构造函数方式创建对象:
function Person(name,age){
this.name=name;
this.age=age;
this.sayname=function(){
alert(this.name);
};
}
构造函数其实就是用new操作符调用的一个函数。用new时构造函数内部的this会指向新的实例,如:
var p1=new Person('tom',10);
此过程中this指向p1,相当于:
p1.name=name;//name为参数tom
p1.age=age;//age为参数10
检测结果:
alert(p1.name); //tom
p1.sayname();<span style="white-space:pre"> </span>//tom
上述在this的帮助下实现p1的属性。
那么倘若不用new呢?直接把构造函数当作一个普通函数来直接调用又会有什么情况:
var p2=Person('tom',10); //直接调用(不适用new)
检测结果:
alert(p2.name);//(报错)name is undefined
p2.sayname(); //(报错)sayname is undefined
用以下代码则能正常运行:
alert(name)//tom
sayname();//tom
很明显此时的name和sayname已经不属于p2,而是属于全局window,等同于:
alert(window.name);
window.sayname();
很明显不用new,而采用直接调用的方式this不在代表新的实例p2,而是window,this把name和sayname全放到了全局window中。
为了确保每次实例化时都能用new,用构造函数创建对象的方式可改进为:
<span style="white-space:pre"> </span>function Person(name,age){
if(this instanceof Person)//先判断this对象是否为Person的实例
{
this.name=name;
this.age=age;
this.sayname=function(){
alert(this.name);
};
}
else
{
return new Person(name,age);//否则用new操作符(调用构造函数)创建新的实例并返回,结果还是使用了new
}
}
这样无论是否用new调用构造函数,其结果都是用new来调用的。
用构造函数创建对象时的this的指向问题的更多相关文章
- 用构造函数创建对象时,new的行为
用构造函数创建对象: var obj=new 类型名(属性值,…) new: 4件事: 1. 创建一个空对象 2. 让新的子对象继承构造函数的原型对象设置(自动设置新对象的__proto__属性指向构 ...
- C#创建对象时各种初始化属性、字段的方式的执行顺序
创建对象代码如下: new FilterInfo(Student.CreateTimeProperty,"朱七",Express.Equals,Relationship.Or) { ...
- 构造函数创建对象和Object.create()实现继承
第一个方法用构造函数创建对象,实现方法的继承 /*创建一个对象把所有公用的属性和方法,放进去*/ function Person() { this.name = "W3cplus" ...
- C++之创建对象时的new与不new
C++在创建对象的时候可以采用两种方式:(例如类名为Test) Test test 或者 Test* pTest = new Test(). 这两种方法都可以实例化一个对象,但是这两种方法有很大的区 ...
- 创建对象时引用的关键字,assign,copy,retain
创建对象时引用的关键字:assign: 简单赋值,不更改索引计数(强引用)copy: 建立一个索引计数为1的对象,然后释放旧对象retain:释放旧的对象,将旧对象的值赋予输入对象,再提高输入对象的索 ...
- javaScript 调用构造函数 Array() 时没有使用参数, length总是0
如果调用构造函数 Array() 时没有使用参数,那么返回的数组为空,length 字段为 0. 当调用构造函数时只传递给它一个数字参数,该构造函数将返回具有指定个数.元素为 undefined 的数 ...
- 编写高质量代码改善C#程序的157个建议——建议10: 创建对象时需要考虑是否实现比较器
建议10: 创建对象时需要考虑是否实现比较器 有对象的地方就会存在比较,在.NET的世界中也一样.举个最简单的例子,在UI中,有一个10个人的Salary列表.根据排序的需要,列表要支持针对基本工资来 ...
- C#程序编写高质量代码改善的157个建议【10-12】[创建对象时需要考虑是否实现比较器、区别对待==和Equals]
前言 建议10.创建对象时需要考虑是否实现比较器 建议11.区别对待==和Equals 建议12.重写Equals时也要重写GetHashCode 建议10.创建对象时需要考虑是否实现比较器 有对象的 ...
- JS创建对象的四种简单方式 (工厂模式和自定义构造函数创建对象的区别)
// 对象:特指的某个事物,具有属性和方法(一组无序的属性的集合) // 特征------>属性 // 行为------>方法 // 创建对象的四种方式 1 // 1.字面量的方式,就是实 ...
随机推荐
- CLR via C#深解笔记二 - 类型设计
类型基础 所有类型都从System.Object派生 CLR要求所有对象都用new 操作符来创建. Employee e = new Employee("Constructor Para ...
- sql like 时间
and Convert(varchar(),TimeStamp,) like '%2013-09-06 09:46:03%'
- 无插件纯Web HTML5 3D机房 终结篇(新增资产管理、动环监控等内容)
原本以为这次的机房资产管理项目告一段落,可以歇一歇,哥还是太天真了.我们伟大的甲方又拿下了第二期的项目,誓把哥的才华发挥到极致啊.国庆长假也没正经休息几天,硬是给人折腾出了个demo,加上了容量管理. ...
- Version of SQLCE in WP8
The version on the device is compatible with version 3.5 on the desktop, but the Windows Phone versi ...
- SQL 解锁表
http://www.cnblogs.com/chjf2008/archive/2012/11/21/2780787.html 最主要是找到最近使用工具或者应用连接过数据库的进程,关掉它就可以了.
- BIEE安装文件下载地址
Repository Creation Utility 下载地址 http://www.oracle.com/technetwork/middleware/bi-enterprise-edition/ ...
- LED子系统剖析
写之前,先看一张图: 上次说了LED驱动程序,Linux自身也携带了LED驱动,且是脱离平台的,即LED子系统.操作起来十分简单.但是它的实质却不是那么容易,研究了一个晚上,终于明白了其中一个文件的功 ...
- DDD:四色原型中Role的 “六” 种实现方式
背景 一个实体在不同的上下文中具备不同的职责,如:产品在“生产完成上下文”中具备的一些职责,在“质检相关上下文”中具备另外一些职责.四色原型.DIC和“UML事物模式”在不同的维度阐述了这一情况,在代 ...
- Java Annotation认知(包括框架图、详细介绍、示例说明)
摘要 Java Annotation是JDK5.0引入的一种注释机制. 网上很多关于Java Annotation的文章,看得人眼花缭乱.Java Annotation本来很简单的,结果说的人没说清楚 ...
- 受限玻尔兹曼机(RBM)学习笔记(一)预备知识
去年 6 月份写的博文<Yusuke Sugomori 的 C 语言 Deep Learning 程序解读>是囫囵吞枣地读完一个关于 DBN 算法的开源代码后的笔记,当时对其中涉及的算法原 ...