# **apply 和 call**
* * * * *
对于 `API` 的使用,例如:`obj.hasOwnProperty(key)` 这类 `API` 就需要使用 `apply` 和 `call` 的第一个参数,指定 `this`。
```
var LimitableMap = function (limit = 10) {
this.limit = limit
this.map = {}
this.keys = []
}
var hasOwnProperty = Object.prototype.hasOwnProperty
LimitableMap.prototype.set = function (key, value) {
var map = this.map
var keys = this.keys
// 如果在map自身属性上没有key
if (!hasOwnProperty.call(map, key)) {
// 如果保存的key等于给定的限制值
if (keys.length === this.limit) {
var shiftKey = keys.shift()
delete map[shiftKey]
}
// 把设置的key值保存在keys数组里
keys.push(key)
}
// 经过上面判断删除值之后就可以添加新值了
map[key] = value
}
LimitableMap.prototype.get = function (key) {
return this.map[key]
}
module.exports = LimitableMap
```
类似上面代码中的 `object.hasOwnProperty`,`object` 就是 `this`,所以需要在 `apply` 或者 `call` 中指定 `this` 参数。