Function原型方法

Function

Function 作为构造函数用来创建一个新的 Function 对象.

概述

详见从Function入手原型链. Function 用来创建函数对象, 而 Function 本身也是函数, 所以有一个让很多人困扰的地方.

1
Object.getPrototypeOf(Function) === Function.prototype  // true

原型方法

Function.prototype.toString()

描述 :
返回一个表示当前函数源代码的字符串.
语法 :

function.toString()

在内置函数或由 Function.prototype.bind 返回的函数上调用该方法, 则有:

1
2
3
4
5
6
7
8
9
10
11
String.toString()
// "function String() { [native code] }"

Number.toString()
// "function Number() { [native code] }"

String.bind(null).toString()
// "function () { [native code] }"

Number.bind(null).toString()
// "function () { [native code] }"

普通函数调用该方法, 则有:

1
2
3
4
5
6
(function() {}).toString()
// "function() {}"

function man(params) {console.log(params)}
man.toString()
// "function man(params) {console.log(params)}"

Function 对象调用该方法, 会抛出 TypeError.

1
2
Function.prototype.toString.call({})
// TypeError: Function.prototype.toString requires that 'this' be a Function

Function.prototype.apply()

描述 :
为调用的函数指定 this 值, 即 this 的执行上下文, 并以数组的形式传入参数.
语法 :

function.apply(thisArg, argArray)

thisArg : 用于改变函数体内部 this 指向的 context. 当 argArrayundefinednull 时, thisArg 将替换成全局对象. 为基本类型值时, 将会被包装成相应的对象. 否则将不会做任何改变.
argArray : 数组或类数组对象. argArray 里的元素将逐个放入参数列表中. 若检测 argArray 不是对象, 将会抛出 TypeError 错误.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
const man = {
age: 18,
sex: 'man',
saySex() {
console.log(`I am a ${this.sex}`)
}
}
const women = {
age: 16,
sex: 'women'
}
man.saySex.apply(women)
// I am a women
------------------------------

function log_1(arg) {
console.log(arg)
}
log_1(1);
log_1(1,2,3);
// 1
// 1

function log_2() {
const log = console.log;
log.apply(null, arguments)
}
log_2(1);
log_2(1, 2, 3)
// 1
// 1 2 3
------------------------------

let a = ['h','e','l','l','o'];
let b = ['w','o','r','l','d'];
let push = Array.prototype.push;
push.apply(a, b);
console.log(a);
// [ 'h', 'e', 'l', 'l', 'o', 'w', 'o', 'r', 'l', 'd' ]

Function.prototype.call()

描述 :
为调用的函数指定 this 值, 即 this 的执行上下文, 并以列表的形式传入参数.
语法 :

function.call(thisArg[ , arg1 [ , arg2, …, argN]])

thisArg : 用于改变函数体内部 this 指向的 context. 当 argArrayundefinednull 时, thisArg 将替换成全局对象. 为基本类型值时, 将会被包装成相应的对象. 否则将不会做任何改变.
argN : 入参将从左到右的顺序加入到参数列表中.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
function Person(name, age) {
this.name = name;
this.age = age;
}
function Man(name, age) {
Person.call(this, name, age);
this.sex = 'man';
}
const Adam = new Man('Adam', 18);
console.log(Adam)
// Man { name: 'Adam', age: 18, sex: 'man' }
------------------------------

let a = ['h','e','l','l','o'];
let push = Array.prototype.push;
push.call(a, 'w','o','r','l','d');
console.log(a);
// [ 'h', 'e', 'l', 'l', 'o', 'w', 'o', 'r', 'l', 'd' ]

Function.prototype.bind()

描述 :
创建一个新的绑定函数, 为函数指定 this 值, 即 this 的执行上下文, 并以列表的形式传入参数.
语法 :

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

thisArg : 调用绑定函数时作为this参数传递给目标函数的值.
argN : 当目标函数被调用时,预先添加到绑定函数的参数列表中的参数.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
for(var i = 0; i <= 3; i++) {
setTimeout((function(i) {
console.log('i', i)
}).bind(null, i), 1000)
}
// 0
// 1
// 2
// 3
------------------------------

// 类数组转数组
let argArray = Array.prototype.slice.call(arguments);
// 或
let slice = Array.prototype.slice;
let boundSlice = Function.prototype.call.bind(slice);
boundSlice(arguments);
------------- The End -------------
显示评论