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 api参考 visualjquery 中国线路 速度快
Nov 30 Javascript
情人节专属 纯js脚本1k大小的3D玫瑰效果
Feb 11 Javascript
javascript 另一种图片滚动切换效果思路
Apr 20 Javascript
IE6-IE9不支持table.innerHTML的解决方法分享
Sep 14 Javascript
js防止表单重复提交的两种方法
Sep 30 Javascript
用js将内容复制到剪贴板兼容浏览器
Mar 18 Javascript
JavaScript使用focus()设置焦点失败的解决方法
Sep 03 Javascript
jquery动态改变div宽度和高度
Feb 09 Javascript
使用window.prompt()实现弹出用户输入的对话框
Apr 13 Javascript
jQuery实现鼠标单击网页文字后在文本框显示的方法
May 06 Javascript
AngularJS中directive指令使用之事件绑定与指令交互用法示例
Nov 22 Javascript
jQuery 隐藏/显示效果函数用法实例分析
May 20 jQuery
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实现Ftp用户的在线管理的代码
2007/03/06 PHP
php上传图片并压缩的实现方法
2015/12/22 PHP
PHP7多线程搭建教程
2017/04/21 PHP
基于jquery的一个简单的脚本验证插件
2010/04/05 Javascript
jquery异步跨域访问代码
2013/06/28 Javascript
JQuery1.8 判断元素是否绑定事件的方法
2014/07/10 Javascript
jquery中使用循环下拉菜单示例代码
2014/09/24 Javascript
JavaScript调用浏览器打印功能实例分析
2015/07/17 Javascript
zTree插件下拉树使用入门教程
2016/04/11 Javascript
BootStrap创建响应式导航条实例代码
2016/05/31 Javascript
判断输入的字符串是否是日期格式的简单方法
2016/07/11 Javascript
js 数据存储和DOM编程
2017/02/09 Javascript
Angularjs分页查询的实现
2017/02/24 Javascript
10道典型的JavaScript面试题
2017/03/22 Javascript
Vue网页html转换PDF(最低兼容ie10)的思路详解
2017/08/24 Javascript
利用原生的JavaScript实现简单拼图游戏
2018/11/18 Javascript
uniapp实现横向滚动选择日期
2020/10/21 Javascript
[02:38]DOTA2超级联赛专访Loda 认为IG世界最强
2013/05/27 DOTA
[50:11]2018DOTA2亚洲邀请赛 4.7总决赛 LGD vs Mineski 第三场
2018/04/09 DOTA
Python实现获取操作系统版本信息方法
2015/04/08 Python
python常见的格式化输出小结
2016/12/15 Python
python模拟登陆,用session维持回话的实例
2018/12/27 Python
使用Python制作一个打字训练小工具
2019/10/01 Python
Python 解析pymysql模块操作数据库的方法
2020/02/18 Python
Python多线程thread及模块使用实例
2020/04/28 Python
使用keras和tensorflow保存为可部署的pb格式
2020/05/25 Python
python语音识别指南终极版(有这一篇足矣)
2020/09/09 Python
python 使用csv模块读写csv格式文件的示例
2020/12/02 Python
请写一个C函数,若处理器是Big_endian的,则返回0;若是Little_endian的,则返回1
2015/07/16 面试题
优秀工会工作者事迹材料
2014/06/02 职场文书
教师师德工作总结2015
2015/07/22 职场文书
2016年安全生产先进个人事迹材料
2016/02/29 职场文书
2016年乡镇七一建党节活动总结
2016/04/05 职场文书
标会主持词应该怎么写?
2019/08/15 职场文书
初中教务主任竞聘演讲稿(范文)
2019/08/20 职场文书
详解thinkphp的Auth类认证
2021/05/28 PHP