new一个函数的过程


new一个函数主要分为四步,如下:

//注意点:

//构造函数一般不需要return。
//如果return了,并且是引用类型,那么将使用其return值,这时不会存在原型链继承。 

/**
 * @description: person构造函数
 * @return {*}
 */
function Person(name, age) {
    this.name = name;
    this.age = age;
}

//设置原型方法
Person.prototype.say = function () {
    alert(`${this.name}说我今年${this.age}岁了`);
}

//模拟new定义
function newFn(fn,...args) {
    let newObj = {};//1. 设置新对象
    newObj.__proto__ = fn.prototype;//2. 设置原型链 让新对象继承构造函数
    let result = fn.call(newObj, ...args);//3. 将this绑定新对象并执行构造函数,保存其结果(构造函数一般没有结果)
    return typeof result === 'object' ? result : newObj;//4. 判断执行结果是否为 object,为object返回执行结果,不为返回新对象
}

//new调用
var obj = newFn(Person,'张三', 18);

obj.say()

文章作者: iamfugui
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 iamfugui !
评论
  目录