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 22 Javascript
JavaScript中的isXX系列是否继续使用的分析
Apr 16 Javascript
jquery对table中各数据的增加、保存、删除操作示例
May 14 Javascript
JavaScript面试开发常用的知识点总结
Aug 08 Javascript
jQuery ztree实现动态树形多选菜单
Aug 12 Javascript
JavaScript中最常见的三个面试题解析
Mar 04 Javascript
各种选择框jQuery的选中方法(实例讲解)
Jun 27 jQuery
js实现图片放大展示效果
Aug 30 Javascript
JS实现点击复选框变更DIV显示状态的示例代码
Dec 18 Javascript
vue-awesome-swiper 基于vue实现h5滑动翻页效果【推荐】
Nov 08 Javascript
Emberjs 通过 axios 下载文件的方法
Sep 03 Javascript
ES11新增的这9个新特性,你都掌握了吗
Oct 15 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 Oauth授权和本地加密实现方法
2016/08/12 PHP
ThinkPHP框架实现FTP图片上传功能示例
2019/04/08 PHP
JavaScript 编程引入命名空间的方法
2007/06/29 Javascript
jQuery easyui datagrid动态查询数据实例讲解
2013/02/26 Javascript
JavaScript中的eval()函数详解
2013/08/22 Javascript
jQuery设置与获取HTML,文本和值的简单实例
2014/02/26 Javascript
js定时器(执行一次、重复执行)
2014/03/07 Javascript
jquery京东商城双11焦点图多图广告特效代码分享
2015/09/06 Javascript
聊一聊JavaScript作用域和作用域链
2016/05/03 Javascript
基于MVC5和Bootstrap的jQuery TreeView树形控件(一)之数据支持json字符串、list集合
2016/08/11 Javascript
前端设计师们最常用的JS代码汇总
2016/09/25 Javascript
微信小程序开发之实现选项卡(窗口顶部TabBar)页面切换
2016/11/25 Javascript
原生js实现弹出层效果
2017/01/20 Javascript
js每隔两秒输出数组中的一项(实例)
2017/05/28 Javascript
从理论角度讨论JavaScript闭包
2019/04/03 Javascript
优雅的处理vue项目异常实战记录
2019/06/05 Javascript
vue点击按钮动态创建与删除组件功能
2019/12/29 Javascript
[05:00]TI9战队采访 - Royal Never Give Up
2019/08/20 DOTA
使用 Python 获取 Linux 系统信息的代码
2014/07/13 Python
Python在groupby分组后提取指定位置记录方法
2018/04/20 Python
Python3.4 tkinter,PIL图片转换
2018/06/21 Python
python列表插入append(), extend(), insert()用法详解
2019/09/14 Python
Python中关于浮点数的冷知识
2019/09/22 Python
解决python web项目意外关闭,但占用端口的问题
2019/12/17 Python
基于python+selenium的二次封装的实现
2020/01/06 Python
总结Pyinstaller的坑及终极解决方法(小结)
2020/09/21 Python
美国杂志订阅折扣与优惠网站:Magazines.com
2016/08/31 全球购物
英国邮购活的植物主要供应商:Gardening Direct
2019/01/28 全球购物
大学毕业通用个人的求职信
2013/12/08 职场文书
触摸春天教学反思
2014/02/03 职场文书
文明礼貌演讲稿
2014/05/12 职场文书
学术会议开幕词
2016/03/03 职场文书
创业项目(超低成本创业项目)
2019/08/16 职场文书
CSS实现单选折叠菜单功能
2021/11/01 HTML / CSS
python 使用tkinter与messagebox写界面和弹窗
2022/03/20 Python
python获取带有返回值的多线程
2022/05/02 Python