前言:
雖然ecmascript從技術上講是一門物件導向的語言,但是它不具備傳統的物件導向語言所支援的類和介面等基本結構。但在es5中,有與類相似的引用型別。引用型別描述一類物件所具有的屬性和方法,引用型別的值(物件)是引用型別的乙個例項,所以也被稱為物件定義。
新物件是使用new 操作符後跟乙個建構函式來建立的。es5提供了多種原生引用型別(如object, array,date, function,regexp等),也支援建立自定義的建構函式,從而定義自定義的物件型別。
一:自定義物件型別
如建立乙個person建構函式:
function person(name,age)
}
下面用new操作符建立person的新例項:
var person1 = new person("tom", 22);
var person2 = new person("jerry", 27);
這種方式呼叫建構函式會經歷下面4個步驟:
(1)建立乙個新物件;
(2)將建構函式的作用域賦給新物件(使this指向新物件);
(3)執行建構函式中的**(為這個新物件新增屬性);
(4)返回新物件。
person1和person2既是object的例項,也是person 的例項,且都有乙個constructor(建構函式)屬性指向person。
二:建構函式與其他函式的對比
建構函式其實也是函式,任何函式,只要通過new操作符來呼叫,那它就可以作為建構函式;如果不用new呼叫,那它也就是個普通函式。所以實際上不存在所謂的「建構函式」,只有對於函式的「構造呼叫」。如上面的person()函式可以有下面兩種呼叫方法:
//當建構函式使用
var person = new person("tom",22);
person.sayname();//"tom"
//作為普通函式使用
person("jerry",27);
window.sayname();//"jerry"
三:建構函式的問題
使用建構函式來建立多個例項物件時,建構函式模式的缺點就會暴露出來。就是每乙個方法都要在每個例項上重新建立一遍。也就是說,在前面的例子中,person1和person2各有乙個sayname()方法,且這兩個同名函式是不相等的。所以,建構函式模式建立了兩個完成同樣任務的函式,這是沒有必要的,所以可以把**改寫成下面所示:
function person(name,age)
function sayname()
var person1 = new person("tom", 22);
var person2 = new person("jerry", 27);
建構函式模式
已經n天沒有學習了。中間辦了好多事,關乎人生大事,所以斷了學習。貌似理由很充分。總之,今天是十一長假的第二天,沒打算出去玩,把前段時間沒學習的趕緊彌補一下吧。上回說到建立物件時用的工廠模式,減少了 重複,可是不能區分出每個例項所對應的物件,於是建構函式登場了。function createobjec...
建構函式模式
function student props student.prototype.hello function function createstudent props var xiaoming createstudent xiaoming.hello hello xiaoming 傳進乙個陣列 f...
工廠模式與建構函式模式
簡單工廠模式 以object建構函式或字面量的方式建立物件有著重複性,會產生大量重複 的缺陷,由此,便出現了工廠模式。function createobj name,age var obj1 createobj 小明 66 var obj2 createobj 小白 13 console.log o...