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 常见对象类创建代码与优缺点分析
Dec 07 Javascript
使用jQuery内容过滤选择器选择元素实例讲解
Apr 18 Javascript
jQuery+formdata实现上传进度特效遇到的问题
Feb 24 Javascript
jQuery获取file控件中图片的宽高与大小
Aug 04 Javascript
JavaScript实现经典排序算法之插入排序
Dec 28 Javascript
javascript 显示全局变量与隐式全局变量的区别
Feb 09 Javascript
原生JavaScript实现Tooltip浮动提示框特效
Mar 07 Javascript
使用jQuery 操作table 完成单元格合并的实例
Dec 27 jQuery
小程序兼容安卓和IOS数据处理问题及坑
Sep 18 Javascript
Vue数据绑定简析小结
May 07 Javascript
vuejs+element UI table表格中实现禁用部分复选框的方法
Sep 20 Javascript
在vue-cli创建的项目中使用sass操作
Aug 10 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
自动把纯文本转换成Web页面的php代码
2009/08/27 PHP
完美的2个php检测字符串是否是utf-8编码函数分享
2014/07/28 PHP
php实现根据字符串生成对应数组的方法
2014/09/22 PHP
php函数式编程简单示例
2019/08/08 PHP
php设计模式之适配器模式原理、用法及注意事项详解
2019/09/24 PHP
Javascript实例教程(19) 使用HoTMetal(3)
2006/12/23 Javascript
AJAX跨域请求json数据的实现方法
2013/11/11 Javascript
JS保留两位小数 四舍五入函数的小例子
2013/11/20 Javascript
JavaScript中的数组特性介绍
2014/12/30 Javascript
jquery实现的3D旋转木马特效代码分享
2015/08/25 Javascript
jQuery插件formValidator实现表单验证
2016/05/23 Javascript
EasyUI加载完Html内容样式渲染完成后显示
2016/07/25 Javascript
js图片上传前预览功能(兼容所有浏览器)
2016/08/24 Javascript
JavaScript中三个等号和两个等号的区别(== 和 ===)浅析
2016/09/22 Javascript
easyui datebox 时间限制,datebox开始时间限制结束时间,datebox截止日期比起始日期大的实现代码
2017/01/12 Javascript
Vue.js分页组件实现:diVuePagination的使用详解
2018/01/10 Javascript
electron + vue项目实现打印小票功能及实现代码
2018/11/25 Javascript
vue element 关闭当前tab 跳转到上一路由操作
2020/07/22 Javascript
Python中3种内建数据结构:列表、元组和字典
2014/11/30 Python
Python2.x和3.x下maketrans与translate函数使用上的不同
2015/04/13 Python
Python中使用urllib2模块编写爬虫的简单上手示例
2016/01/20 Python
Python如何读取MySQL数据库表数据
2017/03/11 Python
python处理Excel xlrd的简单使用
2017/09/12 Python
python找出完数的方法
2018/11/12 Python
python 字符串只保留汉字的方法
2018/11/16 Python
Python+OpenCV实现旋转文本校正方式
2020/01/09 Python
keras得到每层的系数方式
2020/06/15 Python
绢花、人造花和人造花卉:BLOOM
2019/08/07 全球购物
品恩科技软件测试面试题
2014/10/26 面试题
药品采购员岗位职责
2014/02/08 职场文书
个人股份转让协议书范本
2014/10/26 职场文书
2014年平安创建工作总结
2014/11/24 职场文书
2015年教师节贺卡寄语
2015/03/24 职场文书
写给老师的保证书
2015/05/09 职场文书
2015年创先争优工作总结
2015/05/23 职场文书
Python os和os.path模块详情
2022/04/02 Python