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 相关文章推荐
关于文本限制字数的js代码
Apr 02 Javascript
JavaScript 放大镜 移动镜片效果代码
May 09 Javascript
javascript对中文按照拼音排序代码
Aug 20 Javascript
jquery仿百度经验滑动切换浏览效果
Apr 14 Javascript
jQuery EasyUI Dialog拖不下来如何解决
Sep 28 Javascript
JavaScript基础知识点归纳(推荐)
Jul 09 Javascript
javascript如何用递归写一个简单的树形结构示例
Sep 06 Javascript
Vue中封装input组件的实例详解
Oct 17 Javascript
JS实现的简单下拉框联动功能示例
May 11 Javascript
Vue 组件封装 并使用 NPM 发布的教程
Sep 30 Javascript
使用angular-cli webpack创建多个包的方法
Oct 16 Javascript
浅谈bootstrap layer.open中end的使用方法
Sep 12 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中如何实现Hook机制
2017/11/14 PHP
PHP实现的解汉诺塔问题算法示例
2018/08/06 PHP
通过MSXML2自动获取QQ个人头像及在线情况(给初学者)
2007/01/22 Javascript
建议大家看下JavaScript重要知识更新
2007/07/08 Javascript
jQuery阻止冒泡和HTML默认操作
2010/11/17 Javascript
jquery焦点图片切换(数字标注/手动/自动播放/横向滚动)
2013/01/24 Javascript
javascript数据结构与算法之检索算法
2015/04/04 Javascript
详解angularJS自定义指令间的相互交互
2017/07/05 Javascript
node-sass安装失败的原因与解决方法
2017/09/04 Javascript
基于DOM节点删除之empty和remove的区别(详解)
2017/09/11 Javascript
JavaScript中错误正确处理方式小结你用对了吗
2017/10/10 Javascript
纯js实现隔行变色效果
2017/11/29 Javascript
vue初尝试--项目结构(推荐)
2018/01/30 Javascript
浅谈PDF.js使用心得
2018/06/07 Javascript
vue使用screenfull插件实现全屏功能
2020/09/17 Javascript
python求斐波那契数列示例分享
2014/02/14 Python
详解Python中expandtabs()方法的使用
2015/05/18 Python
Python使用xlrd模块操作Excel数据导入的方法
2015/05/26 Python
python获取当前用户的主目录路径方法(推荐)
2017/01/12 Python
Python使用pip安装报错:is not a supported wheel on this platform的解决方法
2018/01/23 Python
通过Python模块filecmp 对文件比较的实现方法
2018/06/29 Python
Python爬虫实现爬取百度百科词条功能实例
2019/04/05 Python
python requests抓取one推送文字和图片代码实例
2019/11/04 Python
如何基于Python实现电子邮件的发送
2019/12/16 Python
对python中各个response的使用说明
2020/03/28 Python
为什么python比较流行
2020/06/19 Python
Python如何急速下载第三方库详解
2020/11/02 Python
HTML5 Canvas+JS控制电脑或手机上的摄像头实例
2014/05/03 HTML / CSS
英国时尚运动品牌的合集:The Sports Edit
2017/12/20 全球购物
通息工程毕业生自荐信
2013/10/16 职场文书
三个儿子教学反思
2014/02/03 职场文书
班训口号大全
2014/06/18 职场文书
财务部岗位职责
2015/02/03 职场文书
浅谈redis五大数据结构和使用场景
2021/04/12 Redis
Go语言空白表示符_的实例用法
2021/07/04 Golang
mysql 子查询的使用
2022/04/28 MySQL