JS中的构造函数详细解析


Posted in Javascript onMarch 10, 2014

在JavaScript中,任何合法的函数都可以作为对象的构造函数,这既包括系统内置函数,也包括用户自己定义的函数。一旦函数被作为构造函数执行,它内部的this属性将引用函数本身。

通常来说,构造函数没有返回值,它们只是初始化由this指针传递进来的对象,并且什么也不返回。如果一个函数有返回值,被返回的对象就成了new表达式的值。从形式上看,一个函数被作为构造函数还是普通函数执行的唯一区别,是否用new运算符。

上面的描述事实上有着更为精确的含义,这要把函数如果有返回值的情况分为函数的返回值是引用类型和值类型两种情况。

如果一个函数的返回值是引用类型(数组,对象或者函数)的数据,那么这个函数作为构造函数用new运算符执行构造时,运算的结果将被它的返回值取代,这时候,构造函数体内的this值丢失了,取而代之的是被返回的对象。例如:

function test()
{
   this.a=10;
   return function()
   {
      return 1;
   }
}
alert m=new test();
var n=test();
alert(m);//返回return后面的闭包
alert(n);//返回return 后面的闭包

运行结果m的值和n的值是一样的,都是test函数返回的闭包,而this引用的对象和this.a=10的赋值结果全部被丢弃。

如果一个函数的返回值是一个值类型,那么这个函数作为构造函数用new运算符执行构造时,它的返回值将被丢弃。new 表达式的结果仍然是this所引用的对象。

function test()
{
   this.a=10;
    return 1;
}
alert m=new test();
var n=test();
alert(m)//返回【Object】
alert(n)//返回1.
Javascript 相关文章推荐
利用JQuery为搜索栏增加tag提示
Jun 22 Javascript
Javascript中匿名函数的多种调用方式总结
Dec 06 Javascript
jQuery中extend函数的实现原理详解
Feb 03 Javascript
JS的数组迭代方法
Feb 05 Javascript
js+html5实现canvas绘制圆形图案的方法
Jun 05 Javascript
解决微信浏览器Javascript无法使用window.location.reload()刷新页面
Jun 21 Javascript
Mvc提交表单的四种方法全程详解
Aug 10 Javascript
vue单页应用在页面刷新时保留状态数据的方法
Sep 21 Javascript
详解jQuery设置内容和属性
Apr 11 jQuery
java实现单链表增删改查的实例代码详解
Aug 30 Javascript
微信小程序错误this.setData报错及解决过程
Sep 18 Javascript
antd table按表格里的日期去排序操作
Nov 17 Javascript
node.js使用nodemailer发送邮件实例
Mar 10 #Javascript
php中给js数组赋值方法
Mar 10 #Javascript
javascript操作referer详细解析
Mar 10 #Javascript
JS数组的赋值介绍
Mar 10 #Javascript
JS删除字符串中重复字符方法
Mar 09 #Javascript
用JavaScript实现类似于ListBox功能示例代码
Mar 09 #Javascript
jquery下div 的resize事件示例代码
Mar 09 #Javascript
You might like
PHP类中的魔术方法(Magic Method)简明总结
2014/07/08 PHP
CodeIgniter钩子用法实例详解
2016/01/20 PHP
php禁用函数设置及查看方法详解
2016/07/25 PHP
Yii 实现数据加密和解密
2021/03/09 PHP
XmlUtils JS操作XML工具类
2009/10/01 Javascript
javascript表格隔行变色加鼠标移入移出及点击效果的方法
2015/04/10 Javascript
jQuery滚动条插件nanoscroller使用指南
2015/04/21 Javascript
JS获取字符串实际长度(包含汉字)的简单方法
2016/08/11 Javascript
JavaScript实现自定义媒体播放器方法介绍
2017/01/03 Javascript
浅谈原生JS中的延迟脚本和异步脚本
2017/07/12 Javascript
vue语法之拼接字符串的示例代码
2017/10/25 Javascript
解决Vue 通过下表修改数组,页面不渲染的问题
2018/03/08 Javascript
JavaScript中import用法总结
2019/01/20 Javascript
微信小程序实现多选框全选与取消全选功能示例
2019/05/14 Javascript
微信小程序中如何计算距离某个节日还有多少天
2019/07/15 Javascript
Nodejs在局域网配置https访问的实现方法
2020/10/17 NodeJs
在VUE中使用lodash的debounce和throttle操作
2020/11/09 Javascript
[45:46]2014 DOTA2国际邀请赛中国区预选赛5.21 HGT VS DT
2014/05/23 DOTA
[51:53]完美世界DOTA2联赛决赛日 Inki vs LBZS 第二场 11.08
2020/11/10 DOTA
python简单实现基于SSL的IRC bot实例
2015/06/15 Python
Python基于回溯法子集树模板实现8皇后问题
2017/09/01 Python
flask-restful使用总结
2018/12/04 Python
安装好Pycharm后如何配置Python解释器简易教程
2019/06/28 Python
Python定时任务APScheduler的实例实例详解
2019/07/22 Python
python根据多个文件名批量查找文件
2019/08/13 Python
用python拟合等角螺线的实现示例
2019/12/27 Python
Python操作MySQL数据库的示例代码
2020/07/13 Python
Lookfantastic法国官网:英国知名美妆购物网站
2017/10/28 全球购物
试用期员工考核制度
2014/01/22 职场文书
办公室主任主任岗位责任制
2014/02/11 职场文书
大学生自我评价范文分享
2014/02/21 职场文书
工作检讨书怎么写
2014/10/10 职场文书
有限责任公司股东合作协议书
2014/12/02 职场文书
继续教育个人总结
2015/03/03 职场文书
《绝招》教学反思
2016/02/20 职场文书
React Fragment介绍与使用详解
2021/11/11 Javascript