JS构造函数之new详解


构造函数的基本使用

function Person(name, age) {
    this.name = name;
    this.age = age
    // return {}
    // return []
    // return function () {}
    // return undefined
    return null
}
Person.prototype.say = function () {
    console.log('说话了')
}
let p = new Person('zsy', 21)
/**
 * 1.返回对象:输出该对象
 * 2.返回数组:输出该数组
 * 3.返回函数: 输出该函数
 * 4.返回undefined:还是输出实例对象 p,也就是跟没有return一样
 * 5.返回null:还是输出实例对象 p,也就是跟没有return一样
 */
console.log(p)  
p.say()

手写实现

在这里插入图片描述

function mockNew() {
    // 拿到Constructor的第一个参数,即构造函数Person
    let Constructor = [].shift.call(arguments)
    // 不要用Object.create(null)创建对象,因为创建出来的对象是没有任何属性的,也没有__proto__等属性
    let obj = {}
    obj.__proto__ = Constructor.prototype;
    // r 为构造函数Person的返回值
    let r = Constructor.apply(obj, arguments)
    // 如果返回的是复杂数据类型(如对象,数组,函数),那么使用返回的结果作为实例对象
    return r instanceof Object ? r : obj
}

function Person(name, age) {
    this.name = name
    this.age = age
    return {}
}
let p = mockNew(Person, 'zsy', 21)
console.log(p)

版权声明:本文为weixin_50238437原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。