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 相关文章推荐
jQuery选择没有colspan属性的td的代码
Jul 06 Javascript
JavaScript flash复制库类 Zero Clipboard
Jan 17 Javascript
js 创建书签小工具之理论
Feb 25 Javascript
Jquery选择子控件"大于号"和" "区别介绍及使用示例
Jun 25 Javascript
js去空格技巧分别去字符串前后、左右空格
Oct 21 Javascript
浅析JQuery中的html(),text(),val()区别
Sep 01 Javascript
基于JavaScript实现移除(删除)数组中指定元素
Jan 04 Javascript
switch语句的妙用(必看篇)
Oct 03 Javascript
单击按钮发送验证码,出现倒计时的简单实例
Mar 17 Javascript
vue元素实现动画过渡效果
Jul 01 Javascript
vue技术分享之你可能不知道的7个秘密
Apr 09 Javascript
vue.js iview打包上线后字体图标不显示解决办法
Jan 20 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
PHP4和PHP5性能测试和对比 测试代码与环境
2007/08/17 PHP
PHP5多态性与动态绑定介绍
2015/04/03 PHP
Laravel使用支付宝进行支付的示例代码
2017/08/16 PHP
PHP操作Postgresql封装类与应用完整实例
2018/04/24 PHP
PDO::getAttribute讲解
2019/01/28 PHP
jQuery的运行机制和设计理念分析
2011/04/05 Javascript
各浏览器中querySelector和querySelectorAll的实现差异分析
2012/05/23 Javascript
javaScript array(数组)使用字符串作为数组下标的方法
2013/11/19 Javascript
基于promise.js实现nodejs的promises库
2014/07/06 NodeJs
浅谈jquery事件处理
2015/04/24 Javascript
JS+DIV实现鼠标划过切换层效果的方法
2015/05/25 Javascript
个人总结的一些JavaScript技巧、实用函数、简洁方法、编程细节
2015/06/10 Javascript
jQuery插件Easyui设置datagrid的pageNumber导致两次请求问题的解决方法
2016/08/06 Javascript
利用angular.copy取消变量的双向绑定与解析
2016/11/25 Javascript
关于AngularJs数据的本地存储详解
2017/01/20 Javascript
如何制作一个Node命令行图像识别工具
2018/12/12 Javascript
JavaScript常见事件处理程序实例总结
2019/01/05 Javascript
详解js创建对象的几种方法及继承
2019/04/12 Javascript
微信小程序 如何获取网络状态
2019/07/26 Javascript
python和shell变量互相传递的几种方法
2013/11/20 Python
实例说明Python中比较运算符的使用
2015/05/13 Python
详解详解Python中writelines()方法的使用
2015/05/25 Python
Django 2.0版本的新特性抢先看!
2018/01/05 Python
python网络编程之多线程同时接受和发送
2019/09/03 Python
python生成任意频率正弦波方式
2020/02/25 Python
Python dict和defaultdict使用实例解析
2020/03/12 Python
Python使用OpenPyXL处理Excel表格
2020/07/02 Python
约瑟夫·特纳男装:Joseph Turner
2017/10/10 全球购物
总经理文秘岗位职责
2014/02/03 职场文书
自荐信的基本格式
2014/02/22 职场文书
学习党的群众路线剖析材料
2014/10/09 职场文书
廉政承诺书
2015/01/19 职场文书
观后感开头
2015/06/19 职场文书
pytorch显存一直变大的解决方案
2021/04/08 Python
老生常谈 使用 CSS 实现三角形的技巧(多种方法)
2021/04/13 HTML / CSS
Python开发之QT解决无边框界面拖动卡屏问题(附带源码)
2021/05/27 Python