JavaScript 函数对象(Function 对象)
2024-10-11 11:55:09
函数对象
当我们对函数使用 typeof 操作符会返回什么?
function f() {
console.log('hello')
}
console.dir(typeof f) // function
实际上函数是一种特殊的 JavaScript 对象。由于函数是对象,所以它也有属性和方法,甚至还可以使用 Function() 构造函数创建新函数对象。
函数对象属性
自有属性
属性名 | 作用 |
---|---|
length | 属性表示函数的参数列表中的参数个数。 |
name | 属性表示定义函数时使用的名字,如果是未命名的函数则为匿名函数。 |
prototype | 属性是函数对象的原型对象,每个函数都有自己的原型对象,当函数被作为构造函数使用是,新创建的对象从这个原型对象继承属性。 |
自定义属性
执行f.count = 0
不是在函数内定义一个局部变量 count 。换句话说,函数属性和变量是毫不相关的两个东西。
函数是一种特殊的对象,可以在它里面添加属性,而且对它的执行没有任何影响。因此,可以将自定义属性缓存到函数对象中,而这个属性只有函数自己会用到。
function f() {
console.log('hello')
f.count++
}
f['count'] = 1 // 自定义函数属性
f() // 执行函数
f() // 执行函数
console.log(`调用次数: ${f.count}`) // 2
函数方法
call()
call() 和 apply() 允许为不同的对象分配和调用属于一个对象的函数,提供新的 this 值给当前调用的函数。
let o = {
print: function(date) {
console.log(`Time: ${date} | ${this.name} 说:${this.content}`)
}
}
let a = {
name: 'xiaoming',
content: '今天天气真好!'
}
let b = {
name: 'xiaohong',
content: '今天天气一般!'
}
o.print.call(a, new Date().getHours()) // Time: 22 | xiaoming 说:今天天气真好!
o.print.call(b, new Date().getHours()) // Time: 22 | xiaohong 说:今天天气一般!
call() 和 apply() 类似于 Java 一样,子类继承父类,并调用父类方法。
bind()
bind() 方法可以把函数绑定到对象上。如果在函数 func 上调用 bind() 方法并传入对象 o ,则这个方法会返回一个新函数,这个函数就像是 func 函数一样。
function func(y) {
return this.x + y
}
let o = {
x: 1
}
let bindFunc = func.bind(o)
console.log(bindFunc(10)) // 11
绑定完成之后,再将这个函数作为另一个对象的属性:
let p = {
x: 10,
bindFunc
}
console.log(p.bindFunc(10)) // 20
说明 bindFunc 依旧绑定的是对象 o 。
函数的构造器
函数本质是对象,而它的构造函数是 Function() ,可以用来创建函数:
const f = new Function('x', 'y', 'return x * y')
最新文章
- ES6笔记(1) -- 环境配置支持
- 清北学堂模拟day6 圆桌游戏
- easylui datagrid 动态生成列
- 深入理解ServletRequest与ServletResponse
- 自己制作 SPx N合1 自动安装盘(x86)
- OS X Git连接github
- CMD命令查询DNS服务器
- hdu 1011 Starship Troopers(树形DP入门)
- django之数据库orm
- Java面向对象(二、继承)
- 【redis】在dotnet core下的redis的使用
- Javascript我学之四作用域
- JAVA新的一天
- AWK入门
- springboot + mybatis配置分页插件
- yum update软件包冲突
- Android手机间无线互传功能探索及实现
- 为 Apache 配置 UTF-8 中文编码
- 对React children 的深入理解
- Python学习笔记015——文件file的常规操作(二进制文件)