js中,构造函数和普通函数声明没什么区别(唯一的区别就是一些规范吧,比如声明构造函数首字母大写,可以用this,普通函数首字母小写,通常不用this等等),比如一个函数
function Foo(name) {
this.name = name || 'default';
}
可以直接调用,也可以用new
关键字来实例化
比如在浏览器直接调用Foo('hello')
时候,this指向的是window对象,所以window.name
的值为hello
用new实例化
var f = new Foo('hello');
那么this指向f,可以通过f来获取name属性
其实new在js运行时候做了下面这些事
- 新建一个新的对象
- 新的对象的__proto__指向构造函数的prototype
- this指向新的构造函数
- 如果构造函数有返回非空对象就返回,否则返回新的对象
根据上面的步骤,我们可以模拟一个new功能,完整代码如下
function NewObject (constructor, ...rests) {
var obj = Object.create(constructor.prototype);
// this指向obj
var returnRet = constructor.apply(obj, rests);
var isPrimitive = returnRet == null || (typeof returnRet !== "object" && typeof returnRet !== "function")
return isPrimitive ? obj: returnRet;
}
function Foo(name) {
this.name = name || 'default';
}
function NewObject (constructor, ...rests) {
var obj = Object.create(constructor.prototype);
// this指向obj
var returnRet = constructor.apply(obj, rests);
var isPrimitive = returnRet == null || (typeof returnRet !== "object" && typeof returnRet !== "function")
return isPrimitive ? obj: returnRet;
}
var a = NewObject(Foo, "kelen");
var a2 = new Foo("kelen");
console.log(a)
console.log(a2);