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 相关文章推荐
JavaScript实现图片自动加载的瀑布流效果
Apr 11 Javascript
浅谈jQuery为哪般去掉了浏览器检测
Aug 29 Javascript
js从数组中删除指定值(不是指定位置)的元素实现代码
Sep 13 Javascript
Vue.js中extend选项和delimiters选项的比较
Jul 17 Javascript
ES6扩展运算符的用途实例详解
Aug 20 Javascript
javascript用rem来做响应式开发
Jan 13 Javascript
vue使用Proxy实现双向绑定的方法示例
Mar 20 Javascript
说说如何使用Vuex进行状态管理(小结)
Apr 14 Javascript
了解JavaScript中let语句
May 30 Javascript
layui+jquery支持IE8的表格分页方法
Sep 28 jQuery
JavaScript实现简单计算器
Mar 19 Javascript
如何使JavaScript休眠或等待
Apr 27 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 Token(令牌)设计
2008/03/15 PHP
常见的四种POST 提交数据方式(小总结)
2015/10/08 PHP
thinkphp表单上传文件并将文件路径保存到数据库中
2016/07/28 PHP
PHP针对redis常用操作实例详解
2019/08/17 PHP
PHP pthreads v3下同步处理synchronized用法示例
2020/02/21 PHP
常用的JavaScript验证正则表达式汇总
2013/11/26 Javascript
使用firebug进行调试javascript的示例
2013/12/16 Javascript
JS操作CSS随机改变网页背景实现思路
2014/03/10 Javascript
jQuery控制的不同方向的滑动(向左、向右滑动等)
2014/07/18 Javascript
使用node.js半年来总结的 10 条经验
2014/08/18 Javascript
jQuery中[attribute*=value]选择器用法实例
2014/12/31 Javascript
jQuery插件Slider Revolution实现响应动画滑动图片切换效果
2015/06/05 Javascript
省市选择的简单实现(基于zepto.js)
2016/06/21 Javascript
基于jQuery实现的打字机效果
2017/01/16 Javascript
jQuery常见面试题之DOM操作详析
2017/07/05 jQuery
浅谈Vue SPA 首屏加载优化实践
2017/12/15 Javascript
NodeJS简单实现WebSocket功能示例
2018/02/10 NodeJs
jsonp跨域获取数据的基础教程
2018/07/01 Javascript
vue-cli项目修改文件热重载失效的解决方法
2018/09/19 Javascript
node.js域名解析实现方法详解
2019/11/05 Javascript
vue:el-input输入时限制输入的类型操作
2020/08/05 Javascript
动态实现element ui的el-table某列数据不同样式的示例
2021/01/22 Javascript
[01:35:13]DOTA2-DPC中国联赛 正赛 DLG vs PHOENIX BO3 第一场 1月18日
2021/03/11 DOTA
利用Django内置的认证视图实现用户密码重置功能详解
2017/11/24 Python
python os用法总结
2018/06/08 Python
使用python3构建文件传输的方法
2019/02/13 Python
python模块导入的方法
2019/10/24 Python
给 TensorFlow 变量进行赋值的方式
2020/02/10 Python
使用Tkinter制作信息提示框
2020/02/18 Python
HTML5 placeholder属性详解
2016/06/22 HTML / CSS
日语求职信范文
2013/12/17 职场文书
打架检讨书2000字
2014/02/22 职场文书
门卫岗位职责说明书
2014/08/18 职场文书
责任书格式
2015/01/29 职场文书
学校世界艾滋病日宣传活动总结
2015/05/05 职场文书
朋友圈早安励志语录!
2019/07/08 职场文书