SOURCE

function objectFactory() {
    var obj = new Object()
    // var obj = Object.prototype
    // var obj = Object.create(null)
    // var obj = Object.create(Constructor.prototype)

    // 取出第一个参数,就是我们要传入的构造函数。此外因为 shift 会修改原数组,所以 arguments 会被去除第一个参数
    Constructor = [].shift.call(arguments)

    // 实例的 __proto__ 属性会指向构造函数的 prototype
    obj.__proto__ = Constructor.prototype;
    // 使用 apply,改变构造函数 this 的指向到新建的对象,这样 obj 就可以访问到构造函数中的属性
    var ret = Constructor.apply(obj, arguments)
    // 判断返回的值是不是一个对象,如果是一个对象,我们就返回这个对象,如果没有,我们该返回什么就返回什么
    return typeof ret === 'object' ? ret : obj
}


function News() {
    console.log(this)
    this.name = 'kalen'
}

News.prototype.say = function () {
    var name = 'kk'
    console.log(this.name)
}

const news = objectFactory(News)

news.say()

const newss = new News()

newss.say()

console.log(news.constructor === News.prototype.constructor)
console.log(news === News.prototype)
console.log(news.__proto__ === News.prototype)
console.log(news.__proto__.constructor === News.prototype.constructor)
console.log(news.__proto__.constructor === news.constructor)
console.log(news.__proto__ === news)
console 命令行工具 X clear

                    
>
console