創建自定義對象的方法
1.工廠模式:
function createPerson (name, obj, job) {
var o = new Object()
o.name = name
o.sayName = function () {
alert(this.name)
}
return o
}
缺點:未解決對象識別的問題。
2.構造函數
function Person (name, age, job) {
this.name = name
this.age = age
this.job = job
this.sayName = function () {
alert(this.name)
}
}
優點:解決了對象識別的問題
缺點:方法未實現共享
3. 原型模式
function Person () {}
Person.prototype.name = '四點鍾',
Person.prototype.job = '前端'
Person.prototype.sayName = function () {
alert(this.name)
}
優點:實現了方法的共享,也規避了對象識別問題
缺點:無法傳遞初始化參數,不僅方法被共享,所有屬性也被共享了,更改了一個實例,所有實例都有可能受到影響。
4.構造函數 + 原型模式
function Person (name, age, job) {
this.name = name
this.age = age
this.job = job
}
Person.prototype = {
constructor: Person,
sayName: function () {
alert(this.name)
}
}
優點:解決對象識別問題。解決屬性的共享。
缺點: 無。
5.寄生構造函數
function SpecialArray (name, job, age) {
var values = new Array()
values.push.apply(values, arguments)
values.toPipedString = function () {
return this.join('|')
}
return values
}
優點: 能夠在不影響原有對象(Array)的基礎上,進行擴展
缺點:不能確定對象類型,且實例和構造函數無任何關系
6.穩妥構造函數
function Person (name, age, job) {
var o = new Object()
o.sayName = fucntion () {
alert(name)
}
return o
}
var friend = Person('四點鍾', 29, '前端')
firend.sayName()
優點:除了調用sayName方法以外,無法訪問到傳入到構造函數中的原始數據成員。不使用this,不使用new運算符操作構造函數
缺點: 還是不能識別對象。