AI智能
改变未来

[JS]函数对象


函数对象

当我们对函数使用 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\')
赞(0) 打赏
未经允许不得转载:爱站程序员基地 » [JS]函数对象