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类中获取外部函数名的方法
Aug 19 Javascript
jQuery阻止冒泡和HTML默认操作
Nov 17 Javascript
Javascript 面向对象编程(一) 封装
Aug 28 Javascript
MooBox 基于Mootools的对话框插件
Jan 20 Javascript
Extjs 3.3切换tab隐藏相应工具栏出现空白解决
Apr 02 Javascript
JavaScript代码里的判断小结
Aug 22 Javascript
微信小程序 点击控件后选中其它反选实例详解
Feb 21 Javascript
Jquery获取radio选中的值
May 05 jQuery
webpack进阶——缓存与独立打包的用法
Aug 02 Javascript
js 图片转base64的方式(两种)
Apr 24 Javascript
vue.js 图片上传并预览及图片更换功能的实现代码
Aug 27 Javascript
解决vue $http的get和post请求跨域问题
Jun 07 Vue.js
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
德生BCL3000的电路分析和打磨
2021/03/02 无线电
php 什么是PEAR?
2009/03/19 PHP
PHP 数组入门教程小结
2009/05/20 PHP
一个不易被发现的PHP后门代码解析
2014/07/05 PHP
PHP+AJAX 投票器功能
2017/11/11 PHP
自写的利用PDO对mysql数据库增删改查操作类
2018/02/19 PHP
一个JS小玩意 几个属性相加不能超过一个特定值.
2009/09/29 Javascript
aspx中利用js实现确认删除代码
2010/07/22 Javascript
javascript图片切换综合实例(循环切换、顺序切换)
2016/01/13 Javascript
第二篇Bootstrap起步
2016/06/21 Javascript
关于在Servelet中如何获取当前时间的操作方法
2016/06/28 Javascript
AngularJS基础 ng-src 指令简单示例
2016/08/03 Javascript
js实现鼠标左右移动,图片也跟着移动效果
2017/01/25 Javascript
Vue.js中用webpack合并打包多个组件并实现按需加载
2017/02/17 Javascript
Vue父子组件双向绑定传值的实现方法
2018/07/31 Javascript
vue中使用GraphQL的实例代码
2019/11/04 Javascript
Vant Weapp组件踩坑:picker的初始赋值解决
2020/11/12 Javascript
python创建只读属性对象的方法(ReadOnlyObject)
2013/02/10 Python
分享Python开发中要注意的十个小贴士
2016/08/30 Python
Python黑帽编程 3.4 跨越VLAN详解
2016/09/28 Python
简单学习Python多进程Multiprocessing
2017/08/29 Python
python编程实现随机生成多个椭圆实例代码
2018/01/03 Python
django 在原有表格添加或删除字段的实例
2018/05/27 Python
解决vscode python print 输出窗口中文乱码的问题
2018/12/03 Python
详解Python数据分析--Pandas知识点
2019/03/23 Python
Django对数据库进行添加与更新的例子
2019/07/12 Python
Sql面试题
2013/03/20 面试题
你经历的项目中的SCM配置项主要有哪些?什么是配置项?
2013/11/04 面试题
高二美术教学反思
2014/01/14 职场文书
"9.18"国耻日演讲稿范文
2014/09/14 职场文书
2014年高三班主任工作总结
2014/12/05 职场文书
护士岗前培训心得体会
2016/01/08 职场文书
优秀范文:读《红岩》有感3篇
2019/10/14 职场文书
详解Python 3.10 中的新功能和变化
2021/04/28 Python
升级 Win11 还是坚守 Win10?微软 Win11 新系统缺失功能大盘点
2022/04/05 数码科技
JavaScript圣杯布局与双飞翼布局实现案例详解
2022/08/05 Javascript