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 相关文章推荐
再论Javascript下字符串连接的性能
Mar 05 Javascript
javascript中关于执行环境的杂谈
Aug 14 Javascript
javascript四舍五入函数代码分享(保留后几位)
Dec 10 Javascript
jquery原理以及学习技巧介绍
Nov 11 Javascript
jQuery图片轮播插件——前端开发必看
May 31 Javascript
js设置和获取自定义属性的方法
Oct 20 Javascript
bootstrap导航栏、下拉菜单、表单的简单应用实例解析
Jan 06 Javascript
react-router中的属性详解
Jun 01 Javascript
BootStrap下的弹出框加载select2框架失败的解决方法
Aug 31 Javascript
微信小程序定位当前城市的方法
Jul 19 Javascript
微信小程序视图控件与bindtap之间的问题的解决
Apr 08 Javascript
vue实现购物车小案例
Sep 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数据入库前清理 注意php intval与mysql的int取值范围不同
2010/12/12 PHP
PHP 杂谈《重构-改善既有代码的设计》之四 简化条件表达式
2012/04/09 PHP
浅谈php和js中json的编码和解码
2016/10/24 PHP
PHP实现从PostgreSQL数据库检索数据分页显示及根据条件查找数据示例
2018/06/09 PHP
php 多进程编程父进程的阻塞与非阻塞实例分析
2020/02/22 PHP
javascript加号"+"的二义性说明
2013/03/04 Javascript
javascript设计模式之中介者模式Mediator
2014/12/30 Javascript
讲解JavaScript的Backbone.js框架的MVC结构设计理念
2016/02/14 Javascript
jquery插件jquery.dragscale.js实现拖拽改变元素大小的方法(附demo源码下载)
2016/02/25 Javascript
JavaScript中的对象和原型(一)
2016/08/12 Javascript
一步一步封装自己的HtmlHelper组件BootstrapHelper(二)
2016/09/14 Javascript
Express与NodeJs创建服务器的两种方法
2017/02/06 NodeJs
AngularJS实现的锚点楼层跳转功能示例
2018/01/02 Javascript
详解Node 定时器
2018/02/26 Javascript
详解基于iview-ui的导航栏路径(面包屑)配置
2019/02/22 Javascript
nodejs中实现用户注册路由功能
2019/05/20 NodeJs
js实现GIF动图分解成多帧图片上传
2019/10/24 Javascript
[02:43]DOTA2英雄基础教程 半人马战行者
2014/01/13 DOTA
python常见排序算法基础教程
2017/04/13 Python
Python实现扩展内置类型的方法分析
2017/10/16 Python
对python cv2批量灰度图片并保存的实例讲解
2018/11/09 Python
python提取包含关键字的整行数据方法
2018/12/11 Python
python实现手机销售管理系统
2019/03/19 Python
Python自带的IDE在哪里
2020/07/01 Python
Python使用sys.exc_info()方法获取异常信息
2020/07/23 Python
Pytorch实验常用代码段汇总
2020/11/19 Python
python实现图像高斯金字塔的示例代码
2020/12/11 Python
纯CSS3绘制打火机动画火焰效果
2016/07/18 HTML / CSS
input file上传文件样式支持html5的浏览器解决方案
2012/11/14 HTML / CSS
canvas 下载二维码和图片加水印的方法
2018/03/21 HTML / CSS
Alba Moda瑞士网上商店:独家意大利时尚女装销售
2016/11/28 全球购物
美国眼镜在线零售商:Dualens
2019/12/07 全球购物
个人委托书
2014/07/31 职场文书
加薪通知
2015/04/25 职场文书
带你了解CSS基础知识,样式
2021/07/21 HTML / CSS
Vue全局事件总线你了解吗
2022/02/24 Vue.js