javascript-new关键字

Posted 张啊咩

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了javascript-new关键字相关的知识,希望对你有一定的参考价值。

new

new 做了什么事?
1. 以 Object.protoype 为原型创建一个新对象

2. 以新对象为 this,执行函数的 [[call]]

3. 如果 [[call]] 的返回值是对象,那么,返回这个对象,否则返回第一步创建的新对象

function myNew(fn, ...args) {
  const obj = Object.create(fn.prototype);
  const ret = fn.call(obj, ...args);
  return ret instanceof Object ? ret : obj; 
}

 

call

实际上就是把方法挂在对象上,执行然后删除

Function.prototype.myCall = function(context, ...args) {
    if (typeof this !== \'function\') {
        throw new TypeError(\'this is not a function\')
    }
    context = context || window;
    context.fn = this;
    const ret = context.fn(...args);
    delete context.fn;
    return ret
}

 

apply

原理和call一样

Function.prototype.myApply = function (context, arg) {
    if (typeof this !== \'function\') {
        throw new TypeError(\'this is not a function\')
    }
    context = context || window;
    context.fn = this;
    let ret;
    if (arg) {
        ret = context.fn(...args);
    } else {
        ret = context.fn();
    }
    delete context.fn;
    return ret
}

 

bind

bind原理就是封一层闭包

function.prototype.myBind = function (context, ...bindArgs) {
    if (typeof this !== \'function\') {
        throw new TypeError(\'this is not a function\');
    }
    const _this = this;
    return function Fn(...execArgs) {
        const args = bindArgs.concat(execArgs);
        return _this.call(this instanceof Fn ? this : context, ...args);
    }
}

 

以上是关于javascript-new关键字的主要内容,如果未能解决你的问题,请参考以下文章

vs 2010代码片段

Alfred常见使用

VSCode 如何操作用户自定义代码片段(快捷键)

在这个 spark 代码片段中 ordering.by 是啥意思?

用于从 cloudkit 检索单列的代码模式/片段

inline内联函数