call与apply都属于Function.prototype的一个方法,所以每个function实例都有call、apply属性;
作用:
call()方法和apply()方法的作用相同:改变this指向。
继承
区别:
穿的参数不一样
模拟实现call()函数:
//双参数实现
Function.prototype.newCall = function (context,...params) {
if (typeof context === 'object') {
context = context || window
} else {
context = Object.create(null);
}
let fn = Symbol();//es6 symbol()表示唯一值;作为属性的时候,不能使用点运算符
context[fn] = this;
var result = context[fn](...params);
delete context[fn];
return result;
}
模拟实现apply()函数:
//apply()函数的双参数实现
Function.prototype.newApply = function(context, parameter) {
if (typeof context === 'object') {
context = context || window
} else {
context = Object.create(null)
}
let fn = Symbol()
context[fn] = this;
var result = context[fn](...parameter);
delete context[fn];
return result;
}
Symbol是由ES6规范引入的一项新特性,它的功能类似于一种标识唯一性的ID。通常情况下,我们可以通过调用Symbol()函数来创建一个Symbol实例:
let s1 = Symbol()
由于Symbol是一种基础数据类型,所以当我们使用typeof去检查它的类型的时候,它会返回一个属于自己的类型symbol;
每个Symbol实例都是唯一的。因此,当你比较两个Symbol实例的时候,将总会返回false;
每个Symbol实例都是唯一的。因此,当你比较两个Symbol实例的时候,将总会返回false;
Symbol类型的key是不能通过Object.keys()或者for...in来枚举的,它未被包含在对象自身的属性名集合(property names)之中。所以,利用该特性,我们可以把一些不需要对外操作和访问的属性使用Symbol来定义。
网友评论