functioncreatePerson(name,age,job){var o =newObject()
o.name = name
o.age = age
o.job = job
o.sayName=function(){
console.log(this.name)}return o
}let person1 =createPerson("nell",12,"software engineer")
构造函数模式
劣:每个方法都要在每个实例上重新创建一遍,若在全局作用域还可能造成变量污染。
person1.sayName()=== person2.sayName()//false
functioncreatePerson(name,age,job){this.name = name
this.age = age
this.job = job
this.sayName=function(){
console.log(this.name)}}let person1 =newcreatePerson("kell",16,"software engineer")let person2 =newcreatePerson("well",30,"software engineer")
functionPerson(name,age,job){this.age = age
this.name = name
this.job = job
this.friends =["xiaoming","xiaohong"]}
Person.prototype ={
constructor: Person
sayName:function(){
console.log(this.name)}}
let person1 =newPerson("ming",18,"Front end engineer")let person2 =newPerson("kong",19,"Front end engineer")
person1.friends === person2.friends //false
person1.sayName()=== person2.sayName()//true
动态原型模式
组合使用构造函数和原型模式,同时在原型模式前添加校验
functionPerson(name,age,job){this.name = name
this.age = age
this.job = job
if(typeofthis.sayName !=="function"){
Person.prototype.sayName=function(){
console.log(this.name)}}}
寄生构造函数模式
和工厂模式相同,使用构造函数封装创建对象。但最后使用new来实例化
缺点:返回的对象与构造函数无关,instanceof不可用,一般不使用
functionPerson(name,age,job){var o =newObject()
o.name = name
o.age = age
o.job = job
o.sayName=function(){
console.log(this.name)}return o
}let person1 =newPerson("Nill",22,"Front end engineer ")
稳妥构造函数模式
安全环境,不使用this,也不实用new
functionPerson(name,age,job){var o =newObject()
o.sayName=function(){
console.log(name)}return o
}