var fun = function () {
this.name = 'peter';
return {
name: 'jack'
};
}
var fun1 = function() {
this.name = 'peter';
return 'jack';
}
var p1 = new fun();
var p2 = new fun1();
p1.name; // jack
p2.name; // peter
为何p1和p2的name值不一样,要从new操作符提及,在new的时刻,顺序做了以下四个建立步骤:
- 建立一个空对象
- 将所建立的对象的__ proto __指向组织函数的prototype
- 执行组织函数中的代码,组织函数中的this指向该对象
- 返回该对象(除非组织函数中返回了一个对象或许函数)
注重第4步,上述 fun和fun1组织函数中因为fun返回的是一个对象,一切p1即是fun中返回的对象,
fun1中返回的不是对象,一切p2.__ proto __即是fun1.prototype;
用代码模仿new建立历程就是
function objectFactory() {
//把argumnets转化为数组
var args = Array.prototype.slice.call(arguments);
// 提取第一个组织对象
var Constructor = args.shift();
// 建立constructor实例 instance
var instance = Object.create(Constructor.prototype);
// 运用apply函数运转args,把instance绑定到this
var temp = Constructor.apply(instance, args);
//返回对象推断,是object 照样 null 照样实例
return (typeof temp === 'object' ||typeof temp === 'function' && temp !== null ) ? temp : instance;
}