编辑代码

    /*
    @author: guoguo
    @title: 如何实现一个 new
    @data:2019.2.19
    */
    function Dog(name) {
        this.name = name
        this.say = function () {
            console.log('name = ' + this.name)
        }
    }
    function Cat(name) {
        this.name = name
        this.say = function () {
            console.log('name = ' + this.name)
        }
    }
    function _new(fn, ...arg) {
        const obj = {}; //创建一个新的对象
        obj.__proto__ = fn.prototype; //把obj的__proto__指向fn的prototype,实现继承
        fn.apply(obj, arg) //改变this的指向
        return Object.prototype.toString.call(obj) == '[object Object]'? obj : {} //返回新的对象obj
    }

    //测试1
    var dog = _new(Dog,'aaa')
    dog.say() //'name = aaa'
    console.log(dog instanceof Dog) //true
    console.log(dog instanceof Cat) //false
    console.log('\n')
    //测试2
    var cat = _new(Cat, 'bbb'); 
    cat.say() //'name = bbb'
    console.log(cat instanceof Cat) //true