1.什么是工厂函数?
工厂函数就是专门用于创建对象的函数, 我们就称之为工厂函数
2.有什么用?
先看不用工厂函数创造对象的做法
let obj1 = {
name: "lnj",
age: 33,
say: function () {
console.log("hello world");
}
};
let obj2 = {
name: "zs",
age: 44,
say: function () {
console.log("hello world");
}
};
这样子批量创造对象简直要命!
运用工厂函数后:
function createPerson(myName, myAge) {
let obj = new Object();
obj.name = myName;
obj.age = myAge;
obj.say = function () {
console.log("hello world");
}
return obj;
}
let obj1 = createPerson("lnj", 34);
let obj2 = createPerson("zs", 44);
console.log(obj1);
console.log(obj2);
注意看流程
工厂函数没有用this的,最后还要返回一个object
1.什么是构造函数
构造函数和工厂函数一样, 都是专门用于创建对象的,构造函数本质上是工厂函数的简写。
function Person(myName, myAge) {
// let obj = new Object(); // 系统自动添加的
// let this = obj; // 系统自动添加的
this.name = myName;
this.age = myAge;
this.say = function () {
console.log("hello world");
}
// return this; // 系统自动添加的
}
1.当我们new Person("abc", 34);系统做了什么事情
- 会在构造函数中自动创建一个对象
- 会自动将刚才创建的对象赋值给this
- 会在构造函数的最后自动添加return this;
上面那样写,其实有性能问题的,有什么性能问题?由于两个对象中的say方法的实现都是一样的, 但是保存到了不同的存储空间中
可以用Person.prototype 保存实例共用的东西,节省内存
function Person(myName, myAge) {
// let obj = new Object(); // 系统自动添加的
// let this = obj; // 系统自动添加的
this.name = myName;
this.age = myAge;
// this.say = fns.mySay;
// return this; // 系统自动添加的
}
Person.prototype = {
say: function () {
console.log("hello world");
}
}
let obj1 = new Person("lnj", 34);
obj1.say();
let obj2 = new Person("zs", 44);
obj2.say();
console.log(obj1.say === obj2.say); // true
关于prototype 见下篇。
网友评论