工厂函数
function factory() {
let obj = {};
obj.name = "小明";
obj.age = function () {
return 13;
};
return obj;
}
let t1 = factory();
let t2 = factory();
// 这其实说明了每一个创建出来的对象都有自己独有的空间,但是实际上公共函数模块没有必要复制多份
console.log(t1.age == t2.age); // false
New 运算符
new 运算符做了什么操作?
- 执行函数
- 创建一个空对象
- 函数里面的 this 指向这个空对象(或者说成是 this 指向实例化出来的对象)
- 隐式返还 this
new 在工厂函数中的运用
// 既然new 会自动创建一个空对象,那么我们没有必要自己再去创建一个对象了
/*
function factory() {
let obj = {};
obj.name = "小明";
obj.age = function () {
return 13;
};
return obj;
}
let t1 = factory();
*/
// 上述代码改写如下
function factory() {
this.name = "小明";
this.age = function () {
return 13;
};
}
let t1 = new factory();
- 那么我们也可以说成是 构造函数 其实是简化后的工厂函数
针对构造函数的一些建议
- 构造函数首字母大写
- 属性放置在构造函数中
- 方法放置在原型上(这样就不需要每次生成对象都会去创建很多一摸一样的函数)
function Factory() {
this.name = "小明";
}
Factory.prototype.age = function () {
return 13;
};
let t1 = new Factory();
let t2 = new Factory();
console.log(t1.age == t2.age); //true
针对 constructor
- constructor 不是构造函数,但是它指向构造函数
仿写简易 new 运算符
// 针对 new 运算符做的操作
function myNew(constructor, ...args) {
let obj = {};
obj.__proto__ = constructor.prototype;
constructor.call(obj, ...args);
return obj;
}
function Factory() {
this.name = "小明";
this.age = function () {
console.log(13);
};
}
let t1 = myNew(Factory);
console.log(t1.name); // 小明
console.log(t1.age()); // 13