工廠模式
function createPerson(name) {
var o = new Object()
o.name = name
o.getName = function() {
console.log(this.name)
}
return o
}
var person1 = new createPerson('zhansan')
缺點(diǎn):對(duì)象無(wú)法識(shí)別,因?yàn)樗械膶?shí)例都指向一個(gè)原型
構(gòu)造函數(shù)模式
function createPerson(name) {
this.name = name
this.getName = function() {
console.log(this.name)
}
}
var person1 = new createPerson('zhansan')
優(yōu)點(diǎn):實(shí)例可以識(shí)別為一個(gè)特定的類型
缺點(diǎn):每次創(chuàng)建實(shí)例時(shí)搔涝,每個(gè)方法都要被創(chuàng)建一次
構(gòu)造函數(shù)優(yōu)化
function createPerson(name) {
this.name = name
this.getName = getName
}
function getName() {
console.log(this)
}
var person1 = new createPerson('zhansan')
優(yōu)點(diǎn):解決了每個(gè)方法都要被重新創(chuàng)建的問(wèn)題
缺點(diǎn):封裝性不好
原型模式
function Person(name) {}
Person.prototype.name = 'zhansan'
Person.prototype.getName = function() {
console.log(this.name)
}
var person1 = new Person()
優(yōu)點(diǎn):方法不會(huì)被重新創(chuàng)建
缺點(diǎn):所有的方法和屬性都共享、不能初始化參數(shù)
原型模式優(yōu)化1
function Person(name) {}
Person.prototype = {
name: 'zhansan',
getName: function() {
console.log(this.name)
}
}
var person1 = new Person()
優(yōu)點(diǎn):封裝性好一點(diǎn)
缺點(diǎn):重寫了原型深浮,丟失了constructor屬性
原型模式優(yōu)化2
function Person(name) {}
Person.prototype = {
constructor: Person,
name: 'zhansan',
getName: function() {
console.log(this.name)
}
}
var person1 = new Person()
優(yōu)點(diǎn):實(shí)例可以通過(guò)constructor屬性找到所屬構(gòu)造函數(shù)
缺點(diǎn):原型模式該有的缺點(diǎn)還是有
組合模式
構(gòu)造函數(shù)模式和原型模式組合使用
function Person(name) {
this.name = name
}
Person.prototype = {
constructor: Person,
getName: function() {
console.log(this.name)
}
}
var person1 = new Person()
優(yōu)點(diǎn):該共享的共享笔呀,該私有的私有,使用最廣泛的方式
缺點(diǎn):封裝性不是很好
動(dòng)態(tài)原型模式
function Person(name) {
this.name = name
if(typeof this.getName != 'function') {
Person.prototype.getName = function() {
console.log(this.name)
}
}
}
var person1 = new Person('zhansan')
注意:使用動(dòng)態(tài)原型模式時(shí)斩萌,不能使用對(duì)象字面量重寫原型
function Person(name) {
this.name = name
if(typeof this.getName != 'function') {
Person.prototype = {
constructor: Person,
getName: function() {
console.log(this.name)
}
}
}
}
var person1 = new Person('zhansan')
var person2 = new Person('lisi')
person1.getName() // 報(bào)錯(cuò),并無(wú)該方法
person2.getName() // 可以訪問(wèn)到
new的實(shí)現(xiàn)步驟:
- 首先新建一個(gè)對(duì)象
- 然后將對(duì)象的原型指向Person.prototype
- 然后Person.apply(obj)改變this指針?lè)较?/li>
- 返回這個(gè)對(duì)象
構(gòu)造函數(shù)的prototype屬性指向了實(shí)例的原型屏轰,使用字面量方式直接覆蓋Person.prototype颊郎,并不會(huì)更改實(shí)例的原型的值,person1依然指向以前的Person的原型霎苗,而不是Person.prototype姆吭。
如果就是想使用字面量的方式寫的話,
function Person(name) {
this.name = name
if(typeof this.getName != 'function') {
Person.prototype = {
constructor: Person,
getName: function() {
console.log(this.name)
}
}
return new Person(name)
}
}
var person1 = new Person('zhansan')
var person2 = new Person('lisi')
person1.getName() // zhansan
person2.getName() // lisi
寄生構(gòu)造函數(shù)模式
function Person(name) {
var o = new Object()
o.name = name
o.getName = function() {
console.log(this.name)
}
return o
}
var person1 = new Person('zhansan')
console.log(person1 instanceof Person) // false
console.log(person1 instanceof Object) // true
這種方式可以在特殊的情況下使用唁盏,比如我們想創(chuàng)建一個(gè)具有額外方法的特殊數(shù)組内狸,但是又不想直接修改Array構(gòu)造函數(shù)
function SpecialArray() {
var values = new Array()
values.push.apply(values, arguments)
values.toPipedString = function() {
return this.join('|')
}
return values
}
var colors = new SpecialArray('red', 'blue', 'green')
var colors2 = SpecialArray('red2', 'blue2', 'green2')
console.log(colors)
console.log(colors.toPipedString()) // red|blue|green
console.log(colors2)
console.log(colors2.toPipedString()) // red2|blue2|green2
穩(wěn)妥構(gòu)造函數(shù)模式
function person(name) {
var o = new Object()
o.getName = function() {
console.log(name)
}
return o
}
var person1 = person('zhansan')
person1.getName() // zhansan
person1.name = 'daisy'
person1.getName() // zhansan
console.log(person1.name) // 'daisy'
所謂穩(wěn)妥對(duì)象,指的是沒(méi)有公共屬性厘擂,而且其方法也不引用this的對(duì)象
與寄生構(gòu)造函數(shù)模式有兩點(diǎn)不同:
- 新創(chuàng)建的實(shí)例方法不引用this
- 不使用new操作符調(diào)用構(gòu)造函數(shù)
穩(wěn)妥對(duì)象最適合在一些安全的環(huán)境中昆淡。
穩(wěn)妥構(gòu)造函數(shù)模式也跟工廠模式一樣,無(wú)法識(shí)別對(duì)象所屬類型