new一个对象过程中的知识点

先文字描述过程,再手撕代码,最后扩展涉及的知识点

过程

(1)创建一个空对象
(2)继承指定构造函数(原本继承的是Object)
(3)将this和调用参数传给构造器执行(call,apply)
(4)如果构造起没有手动返回对象,那就返回this指向的那个对象

代码实现

function Person(name,age){
    let this = {} // 隐式
    this.name = name
    this.age = age
    return this // 隐式
}

function newMethod(Parent, ...setValue) {
    let newObj = {}; // 创建一个新对象
    newObj.__proto__ = Parent.prototype; // 继承构造函数
    Parent.apply(newObj, setValue); // this和参数传递给构造函数执行
    //如果构造函数没有手动返回,则返回newObj 否则返回构造函数手动返回的对象
    if(!Parent()){
        return newObj
    } else {
        return Parent()
    }
}
console.log(newMethod(Person,'lihao', 21 )) // Person { name: 'lihao', age: 21 }

ok如果上面的代码手动返回一个对象

function Person(name,age){
    this.name = name
    this.age = age
    return { // 手动返回
        name: 'jidaoyan',
        age: 23
    }
}
console.log(newMethod(Person,'lihao', 21 )) // { name: 'jidaoyan', age: 23 }

如果有构造函数本身有手动返回,那么传入的参数就不起作用

扩展知识点

构造函数继承构造函数:现在有两个构造函数Person和Animals,Person要继承Animals

// 直接继承
Person.prototype = Animals.prototype
Person.prototype.constructor = Person

对象继承构造函数: 对象是怎么来的 实质是不是new Object(),实例对象的proto 指向它构造函数的原型对象

newObj.__proto__ = Parent.prototype;  //上面例子中对象继承构造函数的方法

apply和call和bind的区别

你可能感兴趣的:(new一个对象过程中的知识点)