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 相关文章推荐
如何实现iframe(嵌入式帧)的自适应高度
Jul 26 Javascript
入门基础学习 ExtJS笔记(一)
Nov 11 Javascript
浅谈JavaScript数据类型
Mar 03 Javascript
JavaScript基于ajax编辑信息用法实例
Jul 15 Javascript
jQuery插件实现无缝滚动特效
Nov 24 Javascript
js判断当前页面在移动设备还是在PC端中打开
Jan 06 Javascript
Bootstrap每天必学之轮播(Carousel)插件
Apr 25 Javascript
BootStrap使用popover插件实现鼠标经过显示并保持显示框
Jun 23 Javascript
BootStrap Fileinput插件和Bootstrap table表格插件相结合实现文件上传、预览、提交的导入Excel数据操作步骤
Aug 07 Javascript
js实现简易聊天对话框
Aug 17 Javascript
在页面中引入js的两种方法(推荐)
Aug 29 Javascript
js判断复选框是否选中的方法示例【基于jQuery】
Oct 10 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
Win2003下APACHE+PHP5+MYSQL4+PHPMYADMIN 的简易安装配置
2006/11/18 PHP
PHP如何得到当前页和上一页的地址?
2006/11/27 PHP
CodeIgniter中使用cookie的三种方式详解
2014/07/18 PHP
Laravel框架中Blade模板的用法示例
2017/08/30 PHP
js替代copy(示例代码)
2013/11/27 Javascript
JavaScript中遍历对象的property的3种方法介绍
2014/12/30 Javascript
jQuery操作cookie
2016/08/08 Javascript
jQuery视差滚动效果网页实现方法经验总结
2016/09/29 Javascript
AngularJS中transclude用法详解
2016/11/03 Javascript
Javascript继承机制详解
2017/05/30 Javascript
JavaScript中Require调用js的实例分享
2017/10/27 Javascript
Node.js如何优雅的封装一个实用函数的npm包的方法
2019/04/29 Javascript
简单了解微信小程序的目录结构
2019/07/01 Javascript
JS猜数字游戏实例讲解
2020/06/30 Javascript
用vue设计一个日历表
2020/12/03 Vue.js
用Python编写生成树状结构的文件目录的脚本的教程
2015/05/04 Python
python开发之IDEL(Python GUI)的使用方法图文详解
2015/11/12 Python
Python实现按学生年龄排序的实际问题详解
2017/08/29 Python
Python使用matplotlib绘制随机漫步图
2018/08/27 Python
通过python将大量文件按修改时间分类的方法
2018/10/17 Python
详解python读取image
2019/04/03 Python
详解Python sys.argv使用方法
2019/05/10 Python
解决pyCharm中 module 调用失败的问题
2020/02/12 Python
Django ORM实现按天获取数据去重求和例子
2020/05/18 Python
matlab、python中矩阵的互相导入导出方式
2020/06/01 Python
python小技巧——将变量保存在本地及读取
2020/11/13 Python
浅谈css3中的渐进增强和优雅降级
2017/12/01 HTML / CSS
公务员的自我鉴定
2013/10/26 职场文书
大学生简短的自我评价
2014/09/12 职场文书
辞职信模板(中英文版)
2015/02/27 职场文书
食品药品安全责任书
2015/05/11 职场文书
2015社区个人工作总结范文
2015/05/13 职场文书
债务纠纷代理词
2015/05/25 职场文书
2019年教师入党申请书
2019/06/27 职场文书
为什么 Nginx 比 Apache 更牛逼
2021/03/31 Servers
Python实战之实现简易的学生选课系统
2021/05/25 Python