广告
返回顶部
首页 > 资讯 > 前端开发 > JavaScript >JS深入浅出Function与构造函数
  • 370
分享到

JS深入浅出Function与构造函数

2024-04-02 19:04:59 370人浏览 独家记忆
摘要

目录 1.概述1.1利用Function构造函数创建函数1.2Function与Object2.构造函数2.1自定义否则函数2.2对象的constructor属性2.3构造函数与函数

 1.概述

Function是一个构造函数,可以通过该构造函数去创建一个函数,创建的函数是一个Function对象,实际上,不管使用什么方式创建的都是一个Function对象,本质上函数名仅仅是一个变量名,它指向某个Function对象的引用。

验证代码如下所示:


var f = function () {
  console.log('this is f function');
}
// 函数也是一个对象
console.log(f instanceof Object); // true
// 函数是Function类型的对象
console.log(f instanceof Function); // true

1.1利用Function构造函数创建函数

Function****构造函数创建一个新的Function对象。直接调用此构造函数可用动态创建函数。

语法结构如下:


var functionName = new Function ([arg1[, arg2[, ...argN]],] functionBody)


其中functionName表示函数名称,[arg1[, arg2[, ...argN]],]表示可选的参数列表,functionBody表示函数

示例代码如下所示:


// 无参的函数
var fun = new Function('console.log("这是一个函数")')
fun() // 这是一个函数
// 带一个参数的函数
var fun = new Function('a', 'console.log("这个函数带一个参数:" + a)')
fun(100) // 这个函数带一个参数:100
// 带两个参数的函数
var fun = new Function(
  'a, b',
  'console.log("这是带两个参数的函数,分别是" + a + "和" + b);',
)
fun(100, 200) // 这是带两个参数的函数,分别是100和200

在实际的开发中我们一般不使用这种方式创建函数,因为它毫无可读性。

1.2Function与Object

  • Object类型和Functionjavascript中的引用类型之一
  • 构造函数也是函数的一种
  • 函数其实是一个Function类型的对象
  • JavaScript中所有对象都是Object类型的

验证代码如下:


console.log(Function instanceof Function) //true
console.log(Function instanceof Object) //true
console.log(Object instanceof Object) //true
console.log(Object instanceof Function) //true

2.构造函数

2.1自定义否则函数

构造函数又称为构造器或对象模板,是对象中的一个方法,在实例化时构造器被调用。在JavaScript中函数就可以作为构造器使用,因此不需要特别定义一个构造器方法。

创建构造函数的语法结构如下所示:


function Person(){
  this.属性名 = 属性值;
  this.方法名 = function() {
      方法体
}
var person = new Person();


这里的Person是作为构造函数的名称,将Person实例化需要使用new关键字,还有一点需要说的就是构造函数一般首字母都是大写的。

如下代码展示了如何通过创建一个构造函数以及如何通过构造函数去实例化一个类:


// 自定义构造函数 -> 作用:创建对象
function Person(name, age, sex) {
  this.name = name
  this.age = age
  this.sex = sex
  this.print = function () {
    console.log(name + '今年' + age + '岁 性别' + sex)
  }
}
// 创建 一碗甜
var t = new Person('一碗甜', 18, '女')
hong.print() // 一碗甜今年18岁 性别女
// 创建 一碗周
var z = new Person('一碗周', 20, '男')
dong.print() //一碗粥今年20岁 性别男

2.2对象的constructor属性

Object对象提供的constructor属性,返回创建实例对象Object的构造函数的引用。

所有对象都会从它的原型上继承一个constructor属性:

值得注意的是此属性的值是对函数本身的引用,而不是一个包含函数名称的字符串

示例代码如下:


// 创建 一碗周
var z = new Person('一碗周', 18, '男')
// 判断是否为 Person 构造函数的对象
console.log(z.constructor === Person)

2.3构造函数与函数

先看一段代码


function Hero() {
  // 当作是一个函数来使用
  var v = 100 // 局部变量
  // 当作是一个构造函数来使用
  this.set = function (value) {
    v = value
  }
  this.get = function () {
    return v
  }
}


在这段代码中,首先我们定义了一个函数,那它也是一个构造函数,当然它还是一个对象。

既然它有三个方面的含义,那就有三个方面的操作,如下所示

  • 直接当做函数调用
  • 通过构造函数创建对象
  • 当做对象为其添加属性或者方法

示例代码代码如下:


// 直接调用
Hero()
// 通过构造函数创建对象
var hero = new Hero()
// 当做对象为其添加属性和方法
Hero.n = '一碗周'
console.log(Hero.n) // 一碗周

3.Function对象的属性和方法

全局的Function对象没有自己的属性和方法,但是,因为它本身也是一个函数,所以它也会通过原型链从自己的原型链Function.prototype上继承一些属性和方法。

3.1length属性

length属性指明函数的形参个数,示例代码如下所示:


// 定义两个空函数
function fun(a, b, c, d) {}

function fn() {}

// 测试 length 属性
console.log(fun.length) // 4
console.log(fn.length) // 0

apply()方法:

**apply()**方法调用一个具有给定this值的函数,以及以一个数组(或类数组对象)的形式提供的参数。

法格式如下:


func.apply(thisArg, [argsArray])


参数解释如下:

  • thisArg:必选的。在func函数运行时使用的this值。请注意,this可能不是该方法看到的实际值:如果这个函数处于非严格模式下,则指定为null或undefined时会自动替换为指向全局对象,原始值会被包装。
  • argsArray:可选的。一个数组或者类数组对象,其中的数组元素将作为单独的参数传给func函数。如果该参数的值为null或undefined,则表示不需要传入任何参数。从ECMAScript5开始可以使用类数组对象。

返回值是调用有指定this值和参数的函数的结果。

如下代码展示了apply()方法的用法:


// 定义一个函数
function fn(a) {
  console.log('this is ' + a)
}
fn.apply(null, ['函数']) // this is 函数

// 上面的调用方式等同于下面这种方式
fn('函数') // this is 函数

3.2call()方法

该方法的语法和作用与apply()方法类似,只有一个区别,就是call()方法接受的是一个参数列表,而apply()方法接受的是一个包含多个参数的数组。

如下代码展示了call()方法的用法:


function fn(a) {
  console.log('this is ' + a)
}
fn.call(null, '函数') // this is 函数

// 上面的调用方式等同于下面这种方式
fn('函数') // this is 函数

bind()方法:
ind()方法创建一个新的函数,在bind()被调用时,这个新函数的this被指定为bind()的第一个参数,而其余参数将作为新函数的参数,供调用时使用。

参数解释如下:


function.bind(thisArg[, arg1[, arg2[, ...]]])

参数:

thisArg:调用绑定函数时作为this参数传递给目标函数的值。

arg1, arg2, ...:当目标函数被调用时,被预置入绑定函数的参数列表中的参数。

返回值是一个原函数的拷贝,并拥有指定的**this**值和初始参数。

如下代码展示了bind()方法的:


// 定义一个函数
var fun = function (a, b) {
  console.log('第一个参数的值为:' + a + '第二个参数的值为:' + b)
}
// 调用 fun()
fun(10, 20) // 第一个参数的值为:10第二个参数的值为:20
// 创建绑定函数
var fn = fun.bind(null, 100, 200) // 有参数默认值的功能
// 调用新创建的函数,不写实参
fn() // 第一个参数的值为:100第二个参数的值为:200

4.Arguments对象

arguments对象是所有(非箭头)函数中都可用的局部变量。你可以使用arguments对象在函数中引用函数的参数。此对象包含传递给函数的每个参数,第一个参数在索引0处。例如,如果一个函数传递了三个参数,你可以以如下方式引用他们:

arguments[0]
arguments[1]
arguments[2]

它的参数也是可以被重新定义的,该对象还提供了两个属性,分别是:

  • arguments.length:返回传递给函数的参数数量
  • arguments.callee :返回指向参数所属的当前执行的函数。如果这个属性后面紧跟一个 (),则表示调用此函数,因为arguments.callee === fun的结果为 true

如下代码展示了该对象的用法,代码如下:



// 定义一个函数
var fun = function () {
  console.log(arguments)
  // arguments.callee  指向参数所属的当前执行的函数。
  //如果给这个属性加一个括号则表示调用。因为 arguments.callee === fun 的结果为 true
  console.log(arguments.callee)
  // arguments.length  传递给函数的参数数量。
  console.log(arguments.length)
}
fun(1, 2, 3, 4, 5) 


代码执行结果如下所示:


[Arguments] { '0': 1, '1': 2, '2': 3, '3': 4, '4': 5 }
[Function: fun]
5


我们可以通过arguments.length属性,来判断传入参数的数量,来完成函数重载的功能,示例代码如下:


// 模拟函数的重载
function add() {
  // 记录参数数量
  var len = arguments.length
  // 通过 switch case 语句判断传入参数数量,来模拟重载的功能
  switch (len) {
    case 2:
      return arguments[0] + arguments[1]
      break
    case 3:
      return arguments[0] + arguments[1] + arguments[2]
      break
    case 4:
      return arguments[0] + arguments[1] + arguments[2] + arguments[3]
      break

    default:
      break
  }
}
console.log(add(1, 2)) // 3
console.log(add(1, 2, 3)) // 6
console.log(add(1, 2, 3, 4)) // 10

5.总结

本篇文章介绍了如何创建构造函数,如何通过构造函数去实例化一个对象;以及Function对象提供的方法和属性有哪些?怎么用,最后还介绍了一个Arguments对象。

到此这篇关于js深入浅出Function与构造函数的文章就介绍到这了,更多相关JS unction与构造函数内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: JS深入浅出Function与构造函数

本文链接: https://www.lsjlt.com/news/158900.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • JS深入浅出Function与构造函数
    目录 1.概述1.1利用Function构造函数创建函数1.2Function与Object2.构造函数2.1自定义否则函数2.2对象的constructor属性2.3构造函数与函数...
    99+
    2022-11-12
  • JS的Function与构造函数怎么使用
    这篇文章主要讲解了“JS的Function与构造函数怎么使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“JS的Function与构造函数怎么使用”吧! 1.概述Function是...
    99+
    2023-06-21
  • C++类与对象深入之构造函数与析构函数详解
    目录对象的初始化和清理一:构造函数1.1:构造函数的特性1.2:构造函数的分类二:析构函数2.1:概念2.2:特性三:拷贝构造函数3.1:概念3.2:特性3.3:拷贝构造函数调用时机...
    99+
    2022-11-13
  • C++拷贝构造函数(深拷贝与浅拷贝)详解
    对于普通类型的对象来说,它们之间的复制是很简单的,例如:int a=88;int b=a; 而类对象与普通对象不同,类对象内部结构一般较为复杂,存在各种成员变量。下面看一个类对象拷贝...
    99+
    2022-11-15
    拷贝构造函数 深拷贝 浅拷贝
  • C++构造函数的类型,浅拷贝与深拷贝详解
    目录一、无参构造函数二、含参构造函数三、拷贝构造函数四、深拷贝和浅拷贝总结一、无参构造函数 1.如果没有定义构造函数,则系统自动调用此默认构造函数,且什么都不做。 2.如果用户自定义...
    99+
    2022-11-13
  • C++深入浅出讲解函数重载
    目录前言函数重载1.1 函数重载的概念1.2 函数重载的意义1.3 名字修饰(name Mangling)1.4 extern "C"前言 自然语言中,一个词可以...
    99+
    2022-11-13
  • C++构造函数的类型,浅拷贝与深拷贝实例分析
    本文小编为大家详细介绍“C++构造函数的类型,浅拷贝与深拷贝实例分析”,内容详细,步骤清晰,细节处理妥当,希望这篇“C++构造函数的类型,浅拷贝与深拷贝实例分析”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。一、无...
    99+
    2023-06-29
  • 深入浅出讲解Java8函数式编程
    目录什么是函数式编程Java8内置了一些常用的方法接口FunctionalInterface用的比较多的函数接口总结什么是函数式编程 函数式编程就是一种抽象程度很高的编程范式,纯粹的...
    99+
    2022-11-13
  • 深入浅出的聊聊Swift高阶函数
    目录初探高阶函数mapcompactMapcompactMapValuesflatMapfilterreduce组合使用总结初探高阶函数 在 Swift 中,高阶函数一共有下面几个...
    99+
    2022-11-12
  • 如何深入浅出Rhino以及与Java和JS的关系
    这期内容当中小编将会给大家带来有关如何深入浅出Rhino以及与Java和JS的关系,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。Java SE的亮点之一就是Oracle详细阐述Java SE 8路线图。我...
    99+
    2023-06-17
  • C语言深入浅出分析函数指针
    我们先看一个代码: #include<stdio.h> void test() { printf("haha\n"); } int main() { printf("...
    99+
    2022-11-13
  • C++深入浅出探索数据结构的原理
    目录一、前言二、C++的数据结构三、定义结构四、访问结构成员五、结构作为函数参数六、指向结构的指针一、前言 因为C++的数据结构很多,很复杂,一篇文章根本讲不到所有的数据结构。即使写...
    99+
    2022-11-13
  • JS中构造函数的基本特性与优缺点
    构造函数:如用函数用来初始化(使用new运算符)一个新建的对象,我们称之为构造函数(constructor) function Person(){ this.name = "...
    99+
    2022-11-13
  • Java深入浅出数组的定义与使用上篇
    目录一、数组的基本用法1.什么是数组2.定义数组 3.数组的使用打印数组: 二、数组作为方法的参数基本用法三、数组练习题1.交换两个变量的值2.写一个方法, 将数组中的每个元素都 *...
    99+
    2022-11-13
  • Java深入浅出数组的定义与使用下篇
    接着上一篇继续,老铁们 1.检查数组的有序性 给定一个整型数组, 判断是否该数组是有序的(升序) public static boolean isUp(int[] arr...
    99+
    2022-11-13
  • JS构造函数和实例化的关系及原型引入
    目录1、 构造函数与实例化2、构造函数与实例化之间的关系?3、per1.say是否等于per2.say4、per1.say不等于per2.say得出的结论5、举例代码问题5.1代码出...
    99+
    2022-11-12
  • 深入浅析同源与跨域,jsonp(函数封装),CORS原理
    目录同源政策Ajax请求限制:Ajax 只能向自己的服务器发送请求同源:同源政策的目的:不受同源策略限制:跨域问题跨域的原因:解决跨域问题:使用 JSONP 解决解决方法:JSONP...
    99+
    2022-11-12
  • 深入浅出理解Java Lambda表达式之四大核心函数式的用法与范例
    目录1.四大核心函数式接口1.1 Consumer<T> : 消费型接口1.2 Supplier<T> : 供给型接口1.3 Function<T, R...
    99+
    2022-11-12
  • JS构造函数和实例化的关系及原型引入举例分析
    这篇文章主要介绍“JS构造函数和实例化的关系及原型引入举例分析”,在日常操作中,相信很多人在JS构造函数和实例化的关系及原型引入举例分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”JS构造函数和实例化的关系...
    99+
    2023-06-21
  • 【C++深入浅出】初识C++上篇(关键字,命名空间,输入输出,缺省参数,函数重载)
         目录 一. 前言 二. 什么是C++ 三. C++关键字初探 四. 命名空间 4.1 为什么要引入命名空间 4.2 命名空间的定义 4.3 命名空间使用 五. C++的输入输出 六. 缺省参数 6.1 缺省参数的概念 6.2 缺...
    99+
    2023-09-02
    c++ 开发语言 笔记 函数重载 缺省参数 命名空间
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作