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 相关文章推荐
使用Modello编写JavaScript类
Dec 22 Javascript
jquery 子窗口操作父窗口的代码
Sep 21 Javascript
jquery validate.js表单验证的基本用法入门
May 13 Javascript
JS判断移动端访问设备并加载对应CSS样式
Jun 13 Javascript
自己动手写的javascript前端等待控件
Oct 30 Javascript
jQuery插件实现可输入和自动匹配的下拉框
Oct 24 Javascript
使用Promise链式调用解决多个异步回调的问题
Jan 15 Javascript
vue获取input输入值的问题解决办法
Oct 17 Javascript
Vue+Vux项目实践完整代码
Nov 30 Javascript
微信小程序之事件交互操作实例分析
Dec 03 Javascript
使用zrender.js绘制体温单效果
Oct 31 Javascript
React如何创建组件
Jun 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
抓取并下载CSS中所有图片文件的php代码
2011/09/26 PHP
PHP与MYSQL中UTF8 中文排序示例代码
2014/10/23 PHP
php读取csv数据保存到数组的方法
2015/01/03 PHP
php动态绑定变量的用法
2015/06/16 PHP
JQuery slideshow的一个小问题(如何发现及解决过程)
2013/02/06 Javascript
JavaScript运行机制之事件循环(Event Loop)详解
2014/10/10 Javascript
jQuery图片特效插件Revealing实现拉伸放大
2015/04/22 Javascript
浅析$.getJSON异步请求和同步请求
2016/06/06 Javascript
jQuery设置聚焦并使光标位置在文字最后的实现方法
2016/08/02 Javascript
详解Vue中过度动画效果应用
2017/05/25 Javascript
如何用RxJS实现Redux Form
2018/12/29 Javascript
vue项目中监听手机物理返回键的实现
2020/01/18 Javascript
[36:33]完美世界DOTA2联赛循环赛 Matador vs Forest 第一场 11.06
2020/11/06 DOTA
从零学Python之入门(三)序列
2014/05/25 Python
用PyQt进行Python图形界面的程序的开发的入门指引
2015/04/14 Python
Django小白教程之Django用户注册与登录
2016/04/22 Python
python语言使用技巧分享
2016/05/31 Python
windows下安装Python和pip终极图文教程
2017/03/05 Python
Python标准库笔记struct模块的使用
2018/02/22 Python
python使用TensorFlow进行图像处理的方法
2018/02/28 Python
Keras实现DenseNet结构操作
2020/07/06 Python
Vans(范斯)德国官网:美国南加州的原创极限运动潮牌
2017/05/02 全球购物
欧舒丹澳洲版:L’OCCITANE
2017/07/17 全球购物
澳大利亚婴儿喂养品牌:Cherub Baby
2018/11/01 全球购物
Java中compareTo和compare的区别
2016/04/12 面试题
求高于平均分的学生学号及成绩
2016/09/01 面试题
Java基础面试题
2012/11/02 面试题
中餐厅主管的职责范文
2014/02/04 职场文书
社会学专业学生职业规划书
2014/02/07 职场文书
环保建议书300字
2014/05/14 职场文书
学雷锋先进个人事迹
2014/05/26 职场文书
小学综治宣传月活动总结
2014/07/02 职场文书
车辆年审委托书范本
2014/09/18 职场文书
假期安全教育广播稿
2014/10/04 职场文书
返乡农民工证明
2015/06/24 职场文书
dubbo集成zipkin获取Traceid的实现
2021/07/26 Java/Android