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 相关文章推荐
免费空间广告万能消除代码
Sep 04 Javascript
date.parse在IE和FF中的区别
Jul 29 Javascript
js复制到剪切板的实例方法
Jun 28 Javascript
JQuery判断子iframe何时加载完成解决方案
Aug 20 Javascript
JavaScript学习笔记之JS函数
Jan 22 Javascript
jQuery1.9.1源码分析系列(十六)ajax之ajax框架
Dec 04 Javascript
JavaScript数据类型转换的注意事项
Jul 31 Javascript
JavaScript插入排序算法原理与实现方法示例
Aug 06 Javascript
详解webpack 最简打包结果分析
Feb 20 Javascript
详解vue中使用vue-quill-editor富文本小结(图片上传)
Apr 24 Javascript
基于elementUI使用v-model实现经纬度输入的vue组件
May 12 Javascript
Web应用开发TypeScript使用详解
May 25 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流量统计功能的实现代码
2012/09/29 PHP
php使用正则表达式提取字符串中尖括号、小括号、中括号、大括号中的字符串
2020/04/05 PHP
codeigniter上传图片不能正确识别图片类型问题解决方法
2014/07/25 PHP
Laravel 4 初级教程之安装及入门
2014/10/30 PHP
PHP常见错误提示含义解释(实用!值得收藏)
2016/04/25 PHP
php结合ajax实现手机发红包的案例
2016/10/13 PHP
ZendFramework框架实现连接两个或多个数据库的方法
2016/12/08 PHP
jQuery检测返回值的数据类型
2015/07/13 Javascript
Javascript中的return作用及javascript return关键字用法详解
2015/11/05 Javascript
js实现页面跳转的五种方法推荐
2016/03/10 Javascript
详解Sea.js中Module.exports和exports的区别
2017/02/12 Javascript
canvas仿iwatch时钟效果
2017/03/06 Javascript
Vue.js自定义事件的表单输入组件方法
2018/03/08 Javascript
JS 实现缓存算法的示例(FIFO/LRU)
2018/03/20 Javascript
Angularjs 根据一个select的值去设置另一个select的值方法
2018/08/13 Javascript
细述Javascript的加法运算符的具体使用
2019/10/18 Javascript
JavaScript单线程和任务队列原理解析
2020/02/04 Javascript
利用Python代码实现数据可视化的5种方法详解
2018/03/25 Python
python装饰器深入学习
2018/04/06 Python
Python cookbook(字符串与文本)在字符串的开头或结尾处进行文本匹配操作
2018/04/20 Python
Python使用matplotlib和pandas实现的画图操作【经典示例】
2018/06/13 Python
使用PyCharm进行远程开发和调试的实现
2019/11/04 Python
python爬虫学习笔记之pyquery模块基本用法详解
2020/04/09 Python
使用python编写一个语音朗读闹钟功能的示例代码
2020/07/14 Python
利用CSS3实现折角效果实例源码
2016/09/28 HTML / CSS
英国领先的在线礼品店:Getting Personal
2019/09/24 全球购物
捷克建筑材料网上商店:DEK.cz
2021/03/06 全球购物
幼儿园长自我鉴定
2013/10/17 职场文书
小学数学课题方案
2014/06/15 职场文书
公司合作协议范文
2014/10/01 职场文书
业务员岗位职责
2015/02/03 职场文书
2015秋季开学典礼演讲稿
2015/07/16 职场文书
岗位聘任协议书
2015/09/21 职场文书
安全生产培训心得体会
2016/01/18 职场文书
求职信如何撰写?
2019/05/22 职场文书
MySQL 隔离数据列和前缀索引的使用总结
2021/05/14 MySQL