# **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` 參數。