js中以构造函数方式调用函数

article/2025/9/24 0:16:22

构造器函数(Constructor functions)的定义和任何其它函数一样,我们可以使用函数声明、函数表达式或者函数构造器(见以前的随笔)等方式来构造函数对象。
要以构造函数的方式调用函数,只需要在调用时在函数名称前加new 关键字,比如:function whatsMyContext(){ return this; }; 调用:new whatsMyContext();
以构造函数的方式调用函数是JavaScript中非常强大的特性,下面来探究它的神秘之处:

function myfunc() {this.aaaa = function() {return this;}
}var one = new myfunc();
var two = new myfunc();assert( one.aaaa() === one, "The 1st myfunc is skulking");
assert( two.aaaa() === two, "The 2nd myfunc is skulking");

上面的demo中,首先创建了一个构造器函数,这个构造器函数会在函数的上下文对象上创建一个名为aaaa的函数属性。接着以构造函数的方式调用函数myfunc()来创建两个myfunc对象,并且分别被one、two引用,最后通过自定义函数assert分别验证每个对象的aaaa方法,每个aaaa方法返回每次以new的方式调用myfunc()函数时构造出来的函数对象。
下面来看一下这个过程中发生了什么:

	1.一个全新的空的对象被创建;2.这个空的对象被传递到构造器函数并且作为它的this参数,因此成为了这个构造器函数的上下文对象;3.在这个新的空的对象上添加属性,shulk4.这个被构造出来的对象被作为函数的返回值返回。

以构造函数方式调用函数
使用构造器函数的目的就是为了创建新的对象,对这个对象进行操作并且这个对象作为构造器函数的返回值返回。任何和这个目的无关的函数都不适合作为构造器函数。
在函数没有返回值的时候以构造函数的方式调用这个函数会返回新创建的上下文对象,那么在函数返回一个值(基本类型)的时候会有什么变化吗?看下面的例子:

function Ninja() {this.skulk = function () {return true;};return 1
}assert(Ninja() === 1,"Return value honored when not called as a constructor");var ninja = new Ninja();assert(typeof ninja === "object","Object returned when called as a constructor");
assert(typeof ninja.skulk === "function","ninja object has a skulk method");

运行上面的例子,所有的断言都可通过,事实上Ninja函数返回一个简单类型的值1对代码的执行没有产生任何影响:如果以函数的方式调用Ninja它将返回1,而以构造函数的方式调用它,会返回new产生的函数上下文对象。 如果函数返回另一个对象会发生什么?

var puppet = {rules: false
};function Emperor() {this.rules = true;return puppet;
}
var emperor = new Emperor();assert(emperor === puppet,"The emperor is merely a puppet!");
assert(emperor.rules === false,"The puppet does not know how to rule!");

这次和上面的例子不同,首先创建一个puppet对象并把它的rules属性设置为false;接着定义一个名为Emperor的函数,并且把它的上下文变量的rules属性设置为true,但是函数最后却把全局的puppet对象作为返回值返回。再接着以构造函数的方式调用Emperor函数;这样产生一个有歧义的情况,我们获得了一个作为函数上下文的对象(this),但是却返回了一个完全不同的对象,这种情况下哪一个对象会被返回呢?

根据后面assert函数的断言测试可以看到,被返回的是puppet函数。
  下面来总结一下:
  1.如果构造器函数返回一个对象,这个对象会作为new表达式的返回值返回,在以new方式调用函数时产生的作为函数上下文(this)的对象会被丢弃;
  2.如果构造器函数没有返回对象(返回值为值类型),这个返回的值会被丢弃,以new方式调用函数时产生的作为函数上下文(this)的对象会被返回。

构造器函数的代码习惯:

构造器函数的目的是为函数调用时产生的上下文对象进行初始化并返回这个对象,虽然这些构造器函数可以以函数或者方法的形式调用,通常情况下那么做并没有什么意义,比如:

function Ninja() {this.skulk = function() {return this;};
}
var whatever = Ninja();

简单的以函数方式调用Ninja,skulk会被绑定到全局变量window上(非严格模式下),这不是特别有用的操作,在严格模式下更没有意义,因为上下文对象this为undefined,因此会抛出不能为undefined设置属性的异常。在非严格模式下,这样做很容易出现莫名其妙的状况,这很难被察觉到因为它没有抛出任何异常。

因为构造器函数也是普通的函数,只是使用不同的方式调用而已,通常情况下,对于构造器函数的定义有不同的命名习惯:

以动词开头用以描述它是来做什么的并且首字母小写的函数名适合普通的函数或者对象的方法;构造器函数的命名通常是一个名词,用来描述要创建的对象,首字母通常大写。


http://chatgpt.dhexx.cn/article/aEDOLBn8.shtml

相关文章

matlab经典调用函数,Matlab怎么调用函数 自定义函数使用方法

Matlab作为一款专业性极强的商业数学软件,将诸多的算法开发、统计分析、数据可视化功能融入其中,用户可以方便地调用需要的函数,建立数学模型,为了满足你工作的需要,还可以自行设置自己需要的函数,下面就跟…

matlab中的函数调用法则,Matlab怎么调用函数?调用函数技巧一览

Matlab作为一款专业性极强的商业数学软件,将诸多的算法开发、统计分析、数据可视化功能融入其中,用户可以方便地调用需要的函数,建立数学模型,为了满足你工作的需要,还可以自行设置自己需要的函数,下面就跟…

java调用函数_Java中如何调用函数和自定义函数

展开全部 1.调用函数方法:对象名.函数名 需要实例化对象,后调用 2.自定义32313133353236313431303231363533e4b893e5b19e31333365663433函数: 结构为:[方法修饰符] ([]) {方法体 } 有以下几种函数: 方法有2种修饰符 1)有public、protected、private三种显示的访问控制修饰…

调用函数

我们定义函数的目的就是调用此函数。 下面来介绍一下调用函数: 函数调用的形式 调用函数的一般形式为: 函数名(实参表列) 如果调用的是无参函数,则“实参表列”可以没有,但括号不能省略。 如果实参表列包…

函数的调用

接着 https://blog.csdn.net/jcf52/article/details/123213269https://blog.csdn.net/jcf52/article/details/123221654 来到了函数进阶: 一.间接调用函数 1.调用函数有直接使用函数名加参数列表的的形式调用,测量这种方式,还可以使用将…

C语言——如何调用函数

C语言——如何调用函数 一、案例: 二、函数的认知 #include <stdio.h> #include <stdlib.h>int prepare() {printf("出门前准备\n");printf("洗漱\n");printf("穿衣\n");return 0; }int onTheRoad() {printf("在路上\n…

3+1活动:结交一个朋友、参与一项运动 、培养一个兴趣爱好 、阅读一本好书

做一个热爱生活的人从31开始 结交一个朋友、参与一项运动 、培养一个兴趣爱好 、阅读一本好书 结交一个朋友 参与一项运动 培养一个兴趣爱好 阅读一本好书

Nature综述:培养未被培养微生物的创新方法

对于培养未被培养的大多数微生物的创新 Innovations to culturing the uncultured microbial majority Nature Reviews Microbiology [IF: 60.633] DOI&#xff1a;https://doi.org/10.1038/s41579-020-00458-8 发表日期&#xff1a;2020-10-22 第一作者&#xff1a;William H.…

自学系列 | 就谈兴趣!

最近接到很多读者的私信&#xff0c;基本都是有关方向的选择上以及如何自学上&#xff0c;还有部分读者问到有关前端的方向&#xff0c;能不能详细写写如果从零学习&#xff0c;能够达到找工作的标准。而且这个自学能力是我们一辈子的生存技能&#xff0c;无论干什么&#xff0…

Nature综述:未培养微生物的新兴培养技术

摘要 尽管近年来微生物基因组数据激增&#xff0c;但通过基于培养的实验对于证实细胞生物学、生态作用和微生物进化的推论仍然十分重要。目前绝大多数古菌和细菌仍难以培养且对其特性了解不够充分&#xff0c;因此研究者们对高效的培养学方法愈加重视&#xff0c;这也加快了许多…

火爆全网,495页《看漫画学Python》全彩PDF免费分享,入门编程培养兴趣首选

在当下全民互联网&#xff0c;大数据的时代&#xff0c;Python已然成为了学习大数据、人工智能时代的首选编程语言&#xff0c;Python因上手简单被越来越多的人所喜爱&#xff0c;近几年更是在各类语言使用排行榜中稳居第一&#xff0c;而且每年是用人数还在直线上升。 但是对…

团队管理21--梯队培养

本文来谈一下我对梯队培养的理解&#xff0c;希望对大家有启发。 梯队培养是我们在团队管理中经常遇到的难题之一&#xff0c;很多管理者都是因为梯队培养不到位而导致团队漏洞百出&#xff0c;工作大受影响。我们建梯队最主要的目的是提高整个团队的战斗力和抵抗力。所谓战斗…

[ 和你一起终身学习]---家长也是需要学习,需要成长的

[ 和你一起终身学习]---家长也是需要学习,需要成长的 一,序言 每一个的成长过程中,都需要不断的学习,更新自己的大脑,就行常用的软件需要不断的更新版本一下,孩子需要在成长的过程中,不断的认识世界,但是作为父母亲,也是要不断的学习,提升认知的. 下面是一孩子家长会后记录的总…

计算机兴趣班学什么好处,电脑兴趣班教学工作计划

电脑兴趣班教学工作计划 信息技术是一门讲究操作性和实践性的课程&#xff0c;六年级信息技术教学应注重培养孩子的动手操作实践能力&#xff0c;达到手脑并用&#xff0c;同步发展。那么具体的教学工作计划怎么制定呢&#xff1f;下面是小编带来关于电脑兴趣班教学工作计划&am…

学习Python想放弃,因为你没有培养自己的兴趣!

大家好&#xff0c;我是菜鸟哥&#xff01; 周末啦&#xff0c;跟大家聊一下我们粉丝团的情况。最近陆陆续续很多粉丝加我的微信&#xff0c;咨询一些学习的问题: 有的问&#xff0c;我已经35岁了&#xff0c;开始学Python编程还来的及吗&#xff1f;有的问&#xff0c;我买了很…

刨根问底(一):从INode客户端看如何培养兴趣

强烈推荐一个大神的人工智能的教程&#xff1a;http://www.captainai.net/zhanghan 前言&#xff1a; 好消息&#xff1a;本人姓张&#xff0c;名小二&#xff0c;性别男&#xff0c;今天正式开通刨根问底系列&#xff0c;望大家以后多多关照。 关于兴趣这个东东在网络天地系列…

刨根问底(二):从INode客户端看如何培养兴趣 (续)

强烈推荐一个大神的人工智能的教程&#xff1a;http://www.captainai.net/zhanghan 背景&#xff1a; 自从4月22号撰写了——《刨根问底&#xff1a;从INode客户端看如何培养兴趣》到今天过去三个月多了&#xff01;无论是评论&#xff0c;邮件还是当面交流&#xff0c;好多人…

VS2015性能分析过程

原文转载于:https://blog.csdn.net/luoweifu/article/details/51470998 上一篇文章带你玩转Visual Studio——VC的多线程开发讲了VC中多线程的主要用法。多线程是提升性能和解决并发问题的有效途经。在商用程序的开发中&#xff0c;性能是一个重要的指标&#xff0c;程序的性能…

吉林大学数据库系统概念2015年期末试题自做答案

简答题 1数据库中常用的完整性约束包括哪些&#xff1f; 答&#xff1a;not null unique check primary key foreign key 2简述数据库系统与文件系统的主要区别。 答&#xff1a;参考课本19页1.8 这两个系统都包含了数据集合和一组程序。数据库协调数据的物理和逻辑访…

2015年CSDN博客排名第一名,何方神圣?

2015年CSDN博客排名第一名&#xff0c;何方神圣&#xff1f; 一、引子&#xff1a; 话说博主phphot&#xff0c;雄霸天下好多年。 俱往矣&#xff0c; 落花流水春去也。 斗转星移&#xff0c;江山易主。 详细可以参见下文&#xff1a; CSDN博客排名第一名&#xff0c;何许人也 …