一、工厂模式
function createPerson(name,sex,age){
let obj = new Object
obj.name = name
obj.sex = sex
obj.age = age
obj.sayName = function(){
alert(this.name)
}
return obj
}
// 字面量增强写法
// function createPerson(name,sex,age){
// let obj = {
// name,
// sex,
// age,
// sayName(){
// alert(this.name)
// }
// }
// return obj
// }
let person1 = createPerson("wsh","male",19)
let person2 = createPerson("yj","female",18)
console.log(person1);
console.log(person2);
缺点:无法解决对象识别的问题
二、构造函数模式
function Person(name, sex, age) {
this.name = name
this.sex = sex
this.age = age
this.sayName = function () {
alert(this.name)
}
}
let person1 = new Person("wsh", "male", 19)
let person2 = new Person("yj", "female", 18)
console.log(person1);
console.log(person2);
缺点:每个方法都要在每个实例上面重新创建一遍
三、原型模式
function Person(){}
Person.prototype = {
name:"wsh",
sex:"male",
age:19,
hobbies:["basketball","game"],
sayName(){
alert(this.name)
}
}
let person1 = new Person()
let person2 = new Person()
person1.name = "yj"
person1.sex = "female"
person1.age = 18
person1.hobbies[0] = "book"
console.log(person1);
console.log(person2);
运行结果:
缺点:
1、省略了为构造函数初始化参数,导致所有实例都将取得相同的默认值
2、 共享“引用类型值”的属性会导致所有实例的原型属性值被修改
四、组合使用构造函数模式和原型模式
function Person(name, sex, age) {
this.name = name
this.sex = sex
this.age = age
this.hobbies = ["basketball", "game"]
}
Person.prototype = {
//当重新给原型对象赋值一个对象时,必须手动添加constructor属性指向原来的构造函数
constructor: Person,
sayName() {
alert(this.name)
}
}
let person1 = new Person("wsh","male",19)
let person2 = new Person("yj","female",18)
person2.hobbies[0] = "book"
console.log(person1);
console.log(person2);
运行结果:
组合模式是目前使用最广泛、认同度最高的一种创建自定义类型的方法
五、动态原型模式
六、寄生构造函数模式
七、稳妥构造函数模式