new实现
new被调用后做了三件事情:
- 让实例可以访问到私有属性
- 让实例可以访问构造函数原型(constructor.prototype)所在原型链上的属性
- 如果构造函数返回的结果不是引用数据类型
*// 优化后 new 实现*
function create() {
if(typeof ctor !== 'function'){
throw 'newOperator function the first param must be a function';
}
*// 1、获得构造函数,同时删除 arguments 中第一个参数*
let Con = [].shift.call(arguments);
*// 2、创建一个空的对象并链接到原型,obj 可以访问构造函数原型中的属性*
let obj = Object.create(Con.prototype);
*// 3、绑定 this 实现继承,obj 可以访问到构造函数中的属性*
let ret = Con.apply(obj, arguments);
*// 4、优先返回构造函数返回的对象*
return ret instanceof Object ? ret : obj;
};
function Foo() {
getName = function () { alert (1); };
return this;
}
Foo.getName = function () { alert (2);};
Foo.prototype.getName = function () { alert (3);};
var getName = function () { alert (4);};
function getName() { alert (5);}
//答案:
Foo.getName();//2
getName();//4
Foo().getName();//1
getName();//1
new Foo.getName();//2
new Foo().getName();//3
new new Foo().getName();//3
function Foo() {
this.getName = function() {
console.log(3);
return {
getName: getName //这个就是第六问中涉及的构造函数的返回值问题
}
}; //这个就是第六问中涉及到的,JS构造函数公有方法和原型链方法的优先级
getName = function() {
console.log(1);
};
return this
}
Foo.getName = function() {
console.log(2);
};
Foo.prototype.getName = function() {
console.log(6);
};
var getName = function() {
console.log(4);
};
function getName() {
console.log(5);
} //答案:
Foo.getName(); //2
getName(); //4
console.log(Foo())
Foo().getName(); //1
getName(); //1
new Foo.getName(); //2
new Foo().getName(); //3
//多了一问
new Foo().getName().getName(); //3 1
new new Foo().getName(); //3