Javascript是物件導向開發的指令碼語言,既然javascript是物件導向開發的,那麼物件導向的前提:抽象,應該必須有,那麼看看這個對象的建立,該如何抽象,然後封裝呢?那麼來看看javascript中對象的建立。
一、建立對象
簡單的對象建立:
var box = new Object(); //建立一個 Object 對象box.name = 'Lee'; //建立一個 name 屬性並賦值 box.age = 100; //建立一個 age 屬性並賦值box.run = function () { //建立一個 run()方法並傳回值 return this.name + this.age + '運行中...';};
這樣一個簡單的類就建立完成。
二、封裝——建構函式/Factory 方法
不難看出,以上的對象建立方式,如果建立多個類似的對象,那麼首要問題就是代碼重複。所以我們要建立可以複用並且保持獨立的對象(獨立:當該對象有多個執行個體時,彼此引用操作該對象後,使得該對象保持不變)。
方法一:Factory 方法
function createObject(name, age) { //集中執行個體化的函數 var obj = new Object(); obj.name = name; obj.age = age; obj.run = function () { return this.name + this.age + '運行中...';}; return obj;}var box1 = createObject('Lee', 100);//第一個執行個體var box2 = createObject('Jack', 200);//第二個執行個體 alert(box1.run());alert(box2.run());//保持獨立
方法二:建構函式
建構函式方式
function Box(name, age) { //建構函式模式 this.name = name; this.age = age; this.run = function () { return this.name + this.age + '運行中...';};}var box1 = new Box('Lee', 100); //new Box()即可 var box2 = new Box('Jack', 200);alert(box1.run());alert(box1 instanceof Box);
區別
建構函式方法
1.沒有顯示的建立對象(new Object());
2.直接將屬性和方法賦值給this對象;
3.沒有renturn語句。
三、繼續封裝——原型(屬性)
1、單獨原型
通過建構函式或者Factory 方法,我們可以得到可以複用且獨立的對象,有些對象的屬性的可變度是很低的,我們把這些屬性封裝在一起,只要執行個體化就可以調用。引入“原型(屬性)”——特點:和所有執行個體化的對象共用這些已有的屬性。如:
function Box() {};Box.prototype = {constructor : Box, name : 'Lee',age : 100,family : ['父親', '母親', '妹妹'], //添加了一個數組屬性run : function () {return this.name + this.age + this.family;}};
只要執行個體化這個對象,就可以訪問該類原型中的變數和方法。
2、建構函式+原型
問題還有:就是有些屬性是不變需要共用,但是有些屬性是變更的不需要共用,或者不需要被外界訪問,放在原型中,豈不是封裝不完全。我們就需要將原型和建構函式結合使用,共用的放在原型中,不共用的放在建構函式中。
function Box(name, age) { //不共用的使用建構函式 this.name = name; this.age = age; this. family = ['父親', '母親', '妹妹'];};Box.prototype = { //共用的使用原型模式constructor : Box, run : function () { return this.name + this.age + this.family;}};
3、最佳化“封裝屬性+建構函式”
當第一次調用建構函式時,run()方法發現不存在,然後初始化原型。當第二次調用,就不會初始化,並且第二次建立新對象,原型也不會再初始化了。這樣及得到了封裝,又實現了原型方法共用,並且屬性都保持獨立。
function Box(name ,age) { //將所有資訊封裝到函數體內 this.name = name; this.age = age;if (typeof this.run != 'function') { //僅在第一次調用的初始化Box.prototype.run = function () { return this.name + this.age + '運行中...'; };} }
到此,javascript的物件導向的第一特徵“封裝”學習到這裡。下篇部落格,介紹談第二個特徵:繼承。
————本人初學,歡迎指正。