創建對象的基本方法
var box = new Object(); //創建一個Object對象
box.name = 'Lee'; //創建一個name屬性並賦值
box.age = 100; //創建一個age屬性並賦值
box.run = function() { //創建一個run方法並返回值
return this.name + this.age + "running...";
}
alert(box.run()); //輸出屬性和方法的值
上面創建一個對象,並且創建了屬性和方法,在run()方法中的this,代表的是box對象本身.這是最基本的創建對象的方法,但有個缺點,想創建一個類似的對象,會產生大量的代碼.
工廠模式
解決多個類似對象的聲明問題,可解決實例化產生大量代碼重複的問題.
function createObject( name, age ) {
var obj = new Object();
obj.name = name;
obj.age = age;
obj.run = function() {
return this.name + this.age + "running...";
};
return obj;
}
var box1 = createObject('Lee',10);
var box2 = createObject('Mike',20);
工廠模式解決了重複實例化的問題,但是不能解決識別問題,因爲根本無法搞清楚他們到底是哪個對象的實例.
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 + 'running...';
}
}
var box1 = new Box('Lee',10);
var box2 = new Box('Mike',20);
使用構造函數,和使用工廠模式的方法的不同之處在於:
- 構造函數方法沒有顯示的創建對象(new Object());
- 直接將屬性和方法賦值給this對象
- 沒有return語句
構造函數的方法的一些規範:
- 函數名和實例化構造名相同且大寫(非強制)
- 通過構造函數創建對象,必須使用new運算符.
構造函數執行的過程:
- 當使用了構造函數,並且new構造函數(),那麼就後臺執行了new Object();
- 將構造函數的作用域給新對象,而函數體內的this就代表new Object()出來的對象.
- 執行構造函數內的代碼.
- 返回新對象(後臺直接返回)
this
this就是代表當前作用域對象的引用.如果在全局範圍this就代表window對象,如果在構造函數體內,就代表當前的構造函數所聲明的對象.
讀寫屬性
讀取對象的屬性,有兩種方法,一種是使用點運算符,還有一種是使用方括號運算符.
var o = {
p : "Hello World"
};
o.p //"Hello World"
o["p"] //"Hello World"
刪除屬性
var o = {p :1};
object.kedys(o) //["p"]
delete o.p //true
o.p //undefined
object.keys(o) //[]
一旦使用delete命令刪除某個屬性,再讀取該屬性就會返回undefined
with語句
格式
with (object)
statement
它的作用是操作同一個對象的多個屬性時,提供一些書寫的方便
with (o) {
p1 = 1;
p2 = 2;
}
//等同於
o.p1 = 1;
o.p2 = 2;