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在IE和FireFox之间常用函数的区别小结
Mar 12 Javascript
容易被忽略的JS脚本特性
Sep 13 Javascript
angularjs指令中的compile与link函数详解
Dec 06 Javascript
jQuery制作效果超棒的手风琴折叠菜单
Apr 03 Javascript
点击页面任何位置隐藏div的实现方法
Sep 05 Javascript
Javascript基础回顾之(三) js面向对象
Jan 31 Javascript
ECMAscript 变量作用域总结概括
Aug 18 Javascript
javascript数据类型中的一些小知识点(推荐)
Apr 18 Javascript
JS前端知识点总结之内置对象,日期对象和定时器相关操作
Jul 05 Javascript
vue路由教程之静态路由
Sep 03 Javascript
vue2和vue3的v-if与v-for优先级对比学习
Oct 10 Javascript
JavaScript选择器函数querySelector和querySelectorAll
Nov 27 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简单浏览目录内容的实现代码
2013/06/07 PHP
PHP中array_merge和array相加的区别分析
2013/06/17 PHP
PHP中将ip地址转成十进制数的两种实用方法
2013/08/15 PHP
一个PHP的远程图片抓取函数分享
2013/09/25 PHP
php实现CSV文件导入和导出
2015/10/24 PHP
PHP的几个常用加密函数
2016/02/03 PHP
php中引用&的用法分析【变量引用,函数引用,对象引用】
2016/12/12 PHP
如何通过Apache在本地配置多个虚拟主机
2020/07/29 PHP
addRule在firefox下的兼容写法
2006/11/30 Javascript
js单例模式详解实例
2013/11/21 Javascript
文本框(input)获取焦点(onfocus)时样式改变的示例代码
2014/01/10 Javascript
js对象基础实例分析
2015/01/13 Javascript
jquery插件star-rating.js实现星级评分特效
2015/04/15 Javascript
JS弹出窗口的运用与技巧大全
2016/11/01 Javascript
bootstrap选项卡使用方法解析
2017/01/11 Javascript
js实现带三角符的手风琴效果
2017/03/01 Javascript
详解如何用webpack打包一个网站应用项目
2017/07/12 Javascript
js分页之前端代码实现和请求处理
2017/08/04 Javascript
Vue中mintui的field实现blur和focus事件的方法
2018/08/25 Javascript
Echart折线图手柄触发事件示例详解
2018/12/16 Javascript
layui(1.0.9)文件上传upload,前后端的实例代码
2019/09/26 Javascript
解决vue组件中click事件失效的问题
2019/11/09 Javascript
VUE 项目在IE11白屏报错 SCRIPT1002: 语法错误的解决
2020/09/27 Javascript
wxPython学习之主框架实例
2014/09/28 Python
基础的十进制按位运算总结与在Python中的计算示例
2016/06/28 Python
Python下载网络小说实例代码
2018/02/03 Python
如何使用Python的Requests包实现模拟登陆
2018/04/27 Python
Python的PIL库中getpixel方法的使用
2020/04/09 Python
EJB的角色和三个对象
2015/12/31 面试题
农业大学毕业生的个人自我评价
2013/10/11 职场文书
税务专业毕业生自荐信
2013/11/10 职场文书
文明学生事迹材料
2014/01/29 职场文书
离婚协议书范文2014
2014/10/16 职场文书
集结号观后感
2015/06/08 职场文书
小学语文课《掌声》教学反思
2016/03/03 职场文书
浅谈如何提高PHP代码的质量
2021/05/28 PHP