En primer lugar, a partir de los siguientes puntos a considerar cómo implementar estas funciones:
- El primer parámetro no se pasa, entonces el contexto predeterminado para la ventana;
- Cambiado este punto, por lo que el nuevo objeto puede realizar esta función, y puede aceptar parámetros.
Así que nos llame primero en lograr
Function.prototype.myCall = function(context) {
if (typeof this !== 'function') {
throw new TypeError('Error')
}
context = context || window
context.fn = this
const args = [...arguments].slice(1)
const result = context.fn(...args)
delete context.fn
return result
}
análisis:
- En primer lugar, el contexto es opcional, si usted no pasa, entonces el contexto predeterminado para la ventana;
- A continuación, cree una propiedad fn al contexto, y establezca el valor en función de la necesidad de llamada;
- Debido a que el número de llamada de los parámetros se puede pasar como un parámetro para una llamada de función, que necesita ser despojado parámetros, y entonces llama a la función de la función y objeto deleción (porque el objeto en sí no es la función, pero en el volumen de suministro llamada, hacer que una propiedad temporal).
La idea es lograr la llamada anterior, se aplica la aplicación es similar, excepto que los parámetros de procesamiento, no es uno de los análisis de las ideas.
Function.prototype.myApply = function(context) {
if (typeof this !== 'function') {
throw new TypeError('Error')
}
context = context || window
context.fn = this
let result
// 处理参数和 call 有区别
if (arguments[1]) {
result = context.fn(...arguments[1])
} else {
result = context.fn()
}
delete context.fn
return result
}
se unen aplicación en comparación con otras dos funciones son un poco más complicado, debido a la necesidad de volver una función de enlace, es necesario determinar el número de asuntos fronterizos, los siguientes son implementación de vinculación:
Function.prototype.myBind = function (context) {
if (typeof this !== 'function') {
throw new TypeError('Error')
}
const _this = this
const args = [...arguments].slice(1)
// 返回一个函数
return function F() {
// 因为返回了一个函数,我们可以 new F(),所以需要判断
if (this instanceof F) {
return new _this(...args, ...arguments)
}
return _this.apply(context, args.concat(...arguments))
}
}
análisis:
- Y los primeros pasos antes de la implementación casi, no entra en detalles.
- se unen devuelve una función, se invoca una función de dos maneras, uno se llama directamente, uno es el nuevo camino a través de la forma en que primero se llama directamente;
- Para llamadas directas, aquí se optó por aplicar las formas, pero los parámetros hay que prestar atención a lo siguiente: se unen porque dicho código puede lograr f.bind similar (obj, 1) (2), por lo que necesitamos a ambos lados del empalme argumento hasta, por lo que es esta args.concat realización (... argumentos);
- Por último, es a través de nuevas formas, en este caso, no va a haber ningún cambio de esta manera, por lo que para ello tenemos que ignorar la función de retorno de este.