[JavaScript]-----面向對象

一 創建對象

var box = new Object();

box.name = 'Lee';

box.age = 100;

box.run = function(){

return this.name + this.age + '運行中...';

}

alert(box.run());

上面創建了一個對象,並且創建屬性和方法,在run方法裏的this,就是代表box對象本身。這種是JavaScript創建對象最基本的方法,但是有個缺點,想創建一個類似的對象,就會產生大量的代碼。

var box2 = box;

box2.name = 'Jack';

alert(box2.run*());    //用box.run發現name也該變了

//保持獨立

var box2 = new Object();

box2.name  = 'Jack';

box2.age = 200;

box2.run = function(){

return this.name + this.age + '運行中....';

}

alert(box2.run());

爲了解決多個類似對象的聲明問題,我們可以使用一種叫做工廠模式的方法,這種方法就是爲了解決 實例化對象產生大量重複的問題。

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()); //保持獨立

工廠模式解決了重複實例化的問題,但還有一個問題,那就是識別問題,因爲根本無法
搞清楚他們到底是哪個對象的實例。
alert(typeof box1); //Object
alert(box1 instanceof Object); //true

ECMAScript 中可以採用構造函數(構造方法)可用來創建特定的對象。類型於Object 對
象。
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); //很清晰的識別他從屬於Box
使用了構造函數的方法,和使用工廠模式的方法他們不同之處如下:
1.構造函數方法沒有顯示的創建對象(new Object());
2.直接將屬性和方法賦值給this 對象;
3.沒有renturn 語句。

構造函數的方法有一些規範:
1.函數名和實例化構造名相同且大寫,(PS:非強制,但這麼寫有助於區分構造函數和
普通函數);
2.通過構造函數創建對象,必須使用new 運算符

關於this 的使用,this 其實就是代表當前作用域對象的引用。如果在全局範圍this 就代
表window 對象,如果在構造函數體內,就代表當前的構造函數所聲明的對象。

構造函數和普通函數的唯一區別,就是他們調用的方式不同。只不過,構造函數也是函
數,必須用new 運算符來調用,否則就是普通函數。

探討構造函數內部的方法(或函數)的問題,首先看下兩個實例化後的屬性或方法是否相
等。
var box1 = new Box('Lee', 100); //傳遞一致
var box2 = new Box('Lee', 100); //同上
alert(box1.name == box2.name); //true,屬性的值相等
alert(box1.run == box2.run); //false,方法其實也是一種引用地址
alert(box1.run() == box2.run()); //true,方法的值相等,因爲傳參一致

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章