物件導向javascript
一、Function就是最優秀的對象
1、在javascript中函數functions是最優秀的對象,他們能夠儲存變數,也
能作為一個參數傳遞給一個方法,它也能夠作為一個方法的傳回值。這些特性都
使得function具有無比的靈活性。
2、我們可以建立“匿名方法”,形如下面的文法:function(){...},可以發現
他們沒有函數簽名,你可以把這個匿名方法賦給變數。下面舉一個匿名方法的例
子:
(function(){
var foo=10;
var bar=2;
alert(foo*bar);
}
)();
這個函數匿名函數並沒有賦值給任何一個變數,注意到最後一對圓擴符,這個申
明使得這個匿名方法會立即得到執行。當然,上面的例子中匿名方法後的括弧中
是空的,沒有攜帶任何參數,實際上,我們也可以為它寫上參數:
(function(foo,bar){
alert(foo*bar);
}
)(10,2);
這個方法的執行結果和上面的執行結果一樣。你也讓匿名方法返回一個值,讓後
再將這個值賦給一個變數:
var baz = (function(foo, bar) {
return foo * bar;
})(10, 2);
// baz will equal 20.
更有趣的是,我們可以通過匿名函數建立閉包。閉包的概念有很專業的解釋,著
這裡簡單化,閉包中可以存放一些受保護的資料,閉包的建立是通過嵌入式的
functions,我們都知道javascript的變數域,一個在函數當中定義的變數時不可
在函數被訪問的。而函數啟動並執行範圍取決於它所定義的地區,而不是執行它的區
域。這一點很重要。這兩點就可以讓我們吧一些要保護的資料放到匿名方法裡,
你可以利用這一點來為類建立私人類型變數(private variables):
/* An anonymous function used as a closure. */
var baz;
(function() {
var foo = 10;
var bar = 2;
baz = function() {
return foo * bar;
};
})();
baz(); // baz can access foo and bar, even though it is executed
outside of the
// anonymous function.
二、易擴充、易變形的對象
在javascript中,所有東西都是對象,除了三個基本類型
(string,number,boolean),而且這些對象都是可變的。譬如:
function displayError(message) {
displayError.numTimesExecuted++;
alert(message);
};
displayError.numTimesExecuted = 0;
就是說,你可以再執行個體化或定義好一個類之後再去修改這個類或者這個執行個體的屬
性或方法。
/* Class Person. */
function Person(name, age) {
this.name = name;
this.age = age;
}
Person.prototype = {
getName: function() {
return this.name;
},
getAge: function() {
return this.age;
}
/* 執行個體化person類. */
var alice = new Person('Alice', 93);
var bill = new Person('Bill', 30);
/* 為類的原型增加方法. */
Person.prototype.getGreeting = function() {
return 'Hi ' + this.getName() + '!';
};
/* 為某個執行個體增加方法. */
alice.displayGreeting = function() {
alert(this.getGreeting());
}
上面的代碼中,getGreeting的修改將會影響所有的類的執行個體,而
displayGreeting則只會影響alice這一個執行個體。