new
new func()
主要过程如下:
- 创建一个空对象
obj
; - 将该空对象的原型设置为构造函数的原型,即
obj.__proto__ = func.prototype
; - 以该对象为上下文执行构造函数,即
func.call(obj)
; - 返回该对象,即
return obj
。
对于第3、4步还有个小细节,如果第3步func
有返回值且返回值为对象,则第4步会返回func
的返回值,反之则默认返回obj
。
模仿new原理的代码如下:
function new2(func) { // func为某个构造函数
var createObject = Object.create(func.prototype); // 以构造函数的原型对象为原型,创建一个空对象,即创建一个{ __proto__: func.prototype }
var returnObject = func.call(createObject); // 使用刚创建的空对象作为上下文(this)执行构造函数
if (typeof returnObject === 'object') { // 若构造函数有返回对象,则返回该对象
return returnObject;
} else { // 若构造函数未返回对象,则返回Object.create创建的对象
return createObject;
}
};
Object.create()
在模仿new原理的代码中用到了Object.create(),它的作用是以入参为原型创建一个空对象,即
Object.create = function (obj) {
return { '__proto__': obj};
};
或
Object.create = function (obj) {
function F() {}
F.prototype = obj;
return new F();
};
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。