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中sort()方法的用法
Nov 04 Javascript
浅析showModalDialog数据缓存问题(用禁止浏览器缓存解决)
Jul 09 Javascript
jquery制作select列表双向选择示例代码
Sep 02 Javascript
jQuery实现文本框邮箱输入自动补全效果
Nov 17 Javascript
JS弹出对话框实现方法(三种方式)
Dec 18 Javascript
如何利用Promises编写更优雅的JavaScript代码
May 17 Javascript
AngularJS入门教程之REST和定制服务详解
Aug 19 Javascript
AngularJS Phonecat实例讲解
Nov 21 Javascript
AngularJS实现进度条功能示例
Jul 05 Javascript
LayUi中接口传数据成功,表格不显示数据的解决方法
Aug 19 Javascript
Canvas实现微信红包照片效果
Aug 21 Javascript
vue表单数据交互提交演示教程
Nov 13 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 需要掌握的东西 不做浮躁的人
2009/12/28 PHP
php绘制一个扇形的方法
2015/01/24 PHP
详解PHP字符串替换str_replace()函数四种用法
2017/10/13 PHP
PHP面向对象五大原则之开放-封闭原则(OCP)详解
2018/04/04 PHP
在Ajax中使用Flash实现跨域数据读取的实现方法
2010/12/02 Javascript
ASP.NET中基于JQUERY的高性能的TreeView补充
2011/02/23 Javascript
网页收藏夹显示ICO图标(代码少)
2015/08/04 Javascript
微信小程序 swiper组件轮播图详解及实例
2016/11/16 Javascript
分分钟玩转Vue.js组件(二)
2017/03/01 Javascript
vue实现百度语音合成的实例讲解
2019/10/14 Javascript
Javascript Web Worker使用过程解析
2020/03/16 Javascript
[07:20]2014DOTA2西雅图国际邀请赛 选手讲解积分赛第二天
2014/07/11 DOTA
[04:28]DOTA2亚洲邀请赛小组赛第五日 TOP10精彩集锦
2015/02/03 DOTA
paramiko模块安装和使用(远程登录服务器)
2014/01/27 Python
Python2中文处理纪要的实现方法
2018/03/10 Python
Python3爬取英雄联盟英雄皮肤大图实例代码
2018/11/14 Python
python对execl 处理操作代码
2020/06/22 Python
使用Python解析Chrome浏览器书签的示例
2020/11/13 Python
python Pexpect模块的使用
2020/12/25 Python
用python查找统一局域网下ip对应的mac地址
2021/01/13 Python
详解CSS3 filter:drop-shadow滤镜与box-shadow区别与应用
2020/08/24 HTML / CSS
HTML5新增的标签和属性归纳总结
2018/05/02 HTML / CSS
用HTML5中的Canvas结合公式绘制粒子运动的教程
2015/05/08 HTML / CSS
一家专门做特卖的网站:唯品会
2016/10/09 全球购物
澳大利亚在线时尚精品店:Hello Molly
2018/02/26 全球购物
预订全球最佳旅行体验:Viator
2018/03/30 全球购物
Rowdy Gentleman服装和配饰:美好时光
2019/09/24 全球购物
给国外客户的邀请函
2014/01/30 职场文书
给妈妈洗脚活动方案
2014/08/16 职场文书
群众路线领导对照材料
2014/08/23 职场文书
党课培训心得体会
2014/09/02 职场文书
社区党的群众路线教育实践活动领导班子对照检查材料
2014/09/25 职场文书
人身意外保险授权委托书
2014/10/01 职场文书
社区五一劳动节活动总结
2015/02/09 职场文书
2016特色励志班级口号
2015/12/24 职场文书
Redis 异步机制
2022/05/15 Redis