js的继承总是看不懂,知道new操作之后终于能理解点了 参考来源:juejin.cn/post/684490… www.jianshu.com/p/66f3aef3e… github.com/mqyqingfeng…
1,为什么需要new
在学c++的时候,我们知道new是为了省代码来批量生产对象,学了点js之后,知道new不只是可以省代码,还可以省内存。
// 构造函数
function Person(name, age, job) {
this.name = name;
this.age = age;
this.job = job;
this.friends = ["Shelby", "Court"];
}
// 原型
Person.prototype = {
sayName: function() {
return this.name;
}
}
// 批量生产person(省代码), 实例的方法指向构造函数的原型的方法,都是一样的(省空间)
var person1 = new Person("Nicholas", 29, "Software Engineer");
var person2 = new Person("Greg", 27, "Doctor");
2,new干了啥
拿person1举例
- 创建(或者说构造)一个全新的对象。
person1 = {}
- 这个新对象会被执行 [[ 原型 ]] 连接。
person1.__proto__ = Person.prototype
- 这个新对象会绑定到函数调用的 this。
Constructor.apply(person1, arguments);
- 如果函数没有返回其他对象,那么 new 表达式中的函数调用会自动返回这个新对象
return person1
3, 怎么实现一个new操作
function objectFactory() {
var obj = new Object(),
Constructor = [].shift.call(arguments);
obj.__proto__ = Constructor.prototype;
var ret = Constructor.apply(obj, arguments);
return typeof ret === 'object' ? ret : obj;
};
因为可能构造函数里面有返回值(返回个对象)