1: 對象字面量的方式
let o = {}
2: 通過Object.create()
let o = Object.create({})
3: 通過new 構造函數的方式
let o = new Object()
function Person(name) {
this.name = name
}
Person.prototype.getName = function () {
return this.name
}
var ObjectFactory = function () {
// 創建一個對象
var obj = new Object()
// 返回第一個參數作為構造函數
var Constructor = [].shift.call(arguments)
// 將構造函數的原型復制於對象的原型
obj.__proto__ = Constructor.prototype
// 調用構造函數,並將obj 作為this, arguments作為參數
var ret = Constructor.apply(obj, arguments)
// 如果構造函數里返回一個對象的話,就直接返回,否則我們就返回this即new創建的對象
return typeof ret === 'object'? ret: obj
}
var a = ObjectFactory(Person, 'sven')
console.log(Object.getPrototypeOf(a) === Person.prototype)
// 效果等效
var a = ObjectFactory(Person, 'sven')
var a = new Person('sven ')
如果構造函數用return 顯示的返回一個對象,那么new之后,會返回這個對象。
如果構造函數不顯示的返回任何數據,或返回一個非對象類型的數據,則默認返回this指定的對象。即構造函數生成的對象。