Open songning0605 opened 4 years ago
面试回答
/**
* 1、创建一个新的对象
* 2、设置对象的原型属性
* 3、确定 this 指向
* 4、返回创建的对象
*/
function create() {
// 1、创建一个新的对象
var obj = new Object();
/**
* 2、设置对象的原型属性,要分为两小步
* 1)拿到构造函数
* 2)设置创建的对象原型属性为构造函数的原型对象,实现继承的目的
*/
// 1)拿到构造函数
var Con = [].shift.call(arguments);
// 2)设置对象的原型属性
obj.__proto__ = Con.prototype;
/**
* 3、确定 this 指向
* 这里其实就是使用 apply 借用构造函数,并指定构造函数中的 this 为新创建的对象,达到继承的目的
*/
var result = Con.apply(obj, arguments);
/**
* 4、返回创建对象,但是这里又分为两种情况
* 1)如果构造函数返回值是引用类型,则返回构造函数的返回值。
* 2)如果构造函数的返回值是基本类型,则返回新创建的对象。
*/
return result instanceof Object ? result : obj;
}
参考:
在学习
new
原理钱,建议先熟悉call, apply
的原理对于
new
操作符,JavaScript高级程序设计(第三版)中是这样解释的1)创建一个新对象;
2)设置原型链
3)确定this指向,执行构造函数中的代码(为这个新对象添加属性);
4)返回新对象。(具体过程如下)
判断构造函数的返回值类型: 如果是值类型,就丢弃它,还是返回instance。 如果是引用类型,就返回这个引用类型的对象,替换掉instance。