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