我感觉手写个new就懂了其实~~
那么先写一个咯
- 创建一个给定构造函数的实例对象 ->
实例[[prototype]] = 构造函数.prototype
function myNew(constructorFn, ...args) {
// 创建一个新的空对象,并连接原型链
var obj = Object.create(constructorFn.prototype);
// 将构造函数的 this 指向新对象,并执行构造函数
var result = constructorFn.apply(obj, args);
// 如果构造函数有显式返回一个对象,则返回该对象
if (typeof result === 'object' && result !== null) {
return result;
}
// 否则,返回新对象
return obj;
}
为什么要呢?
因为如果要构造很多实例,那么实例之间又有重复岂不浪费性能?所以共同的放在原型上就行啦
new之前怎么做?
function Person(ID){
var obj = {}
obj.__proto__ = Person.原型 (这可不是一个正常工作中的写法!)
obj.name = 'Colin'
obj.age = 21
return obj
}
Person.原型 = {
sayName:function(){
console.log(this.name)
}
}
那有了new之后
function Person(ID) {
this.name = 'Colin';
this.age = 21;
}
Person.prototype.sayName = function() {
console.log(this.name);
};
// 使用示例:
var person = new Person();
person.sayName(); // 输出:Colin
看起来棒极了!少了几行代码
- 帮我创建了临时变量
- 帮我绑定原型
- 帮我return
- 统一叫做prototype