Construct JavaScript Objects with Functions
構(gòu)造函數(shù)通常使用大寫字母開頭华坦,以便把自己和其他普通函數(shù)區(qū)別開。
構(gòu)造函數(shù):
var Car = function() {
this.wheels = 4;
this.engines = 1;
this.seats = 5;
};
在構(gòu)造函數(shù)中,this
指向被此 構(gòu)造函數(shù) 創(chuàng)建出來的 對象 桦卒。所以诗箍,當我們在構(gòu)造函數(shù)中寫:
this.wheels = 4;
這時,它創(chuàng)建出來的新對象將帶有wheels
屬性脖苏,并且賦值為 4
.
構(gòu)造函數(shù)描述了它所創(chuàng)建出來的對象程拭。
Make Instances of Objects with a Constructor Function
使用new
關(guān)鍵字 來調(diào)用構(gòu)造函數(shù)時,如下:
var myCar = new Car();
myCar
即 Car
的一個** 實例**(instance)棍潘,它被 構(gòu)造函數(shù) 描述成下面的樣子:
{
wheels: 4,
engines: 1,
seats: 1
}
記资研:要使用 new
關(guān)鍵字 去調(diào)用構(gòu)造函數(shù)。因為只有這樣亦歉,Javascript才知道這是要去構(gòu)造一個新 對象 恤浪,并且把構(gòu)造函數(shù)中的 this
指向這個新對象。
現(xiàn)在肴楷,當 myCar (即 Car 的一個 實例 )創(chuàng)建后水由,他可以像普通對象一樣被使用,包括創(chuàng)建赛蔫、訪問绷杜、修改它的屬性等,就像我們使用其他對象一樣濒募。如下:
myCar.turboType = "twin";
我們的myCar
變量現(xiàn)在有了一個 turboType
屬性了鞭盟,且值為 "twin" 。
在編輯器中瑰剃,使用 Car 這個構(gòu)造函數(shù)去創(chuàng)建一個新的 實例 齿诉,并且把這個實例賦值給 myCar 。
然后給 myCar 創(chuàng)建一個 nickname 屬性,且屬性值為一個字符串.
Make Unique Objects by Passing Parameters to our Constructor
構(gòu)造函數(shù)
加入?yún)?shù)后粤剧,就可以創(chuàng)建不同的對象歇竟。像下面這樣:
var Car = function(wheels, seats, engines) {
this.wheels = wheels;
this.seats = seats;
this.engines = engines;
};
現(xiàn)在,我們可以在調(diào)用構(gòu)造函數(shù)
時傳入一組 參數(shù)
了抵恋。
var myCar = new Car(6, 3, 1);
創(chuàng)建出下面的對象:
{
wheels: 6,
seats: 3,
engines: 1
}
Make Object Properties Private
對象擁有自己的特征焕议,稱為 屬性
,對象還有自己的函數(shù)弧关,稱為方法
盅安。
在前面的課程(構(gòu)造函數(shù))中,我們使用了this
指向當前(將要被創(chuàng)建的)對象中的 公有屬性
世囊。
我們也可以創(chuàng)建 私有屬性
和 私有方法
别瞭,它們兩個在對象外部是不可訪問的。
為了完成這個任務(wù)株憾,我們在 構(gòu)造函數(shù)
中蝙寨,使用我們熟悉的 var
關(guān)鍵字去創(chuàng)建變量,來替代我們使用 this
創(chuàng)建 屬性
嗤瞎。
比如墙歪,我們想記錄我們的car行駛的 speed
,但是我們希望外面的代碼對speed
的修改只能是加速或減速(而不是變成字符串贝奇、直接賦值成某個速度等其他操作)虹菲,那么如何達到這類操作的目的呢?
編輯器中的 構(gòu)造函數(shù)
展示了如何實現(xiàn)這種控制模式:
var Car = function() {
// this is a private variable
var speed = 10;
// these are public methods
this.accelerate = function(change) {
speed += change;
};
this.decelerate = function() {
speed -= 5;
};
this.getSpeed = function() {
return speed;
};
};
Iterate over Arrays with map
map
方法可以方便的迭代數(shù)組弃秆,例子:
var timesFour = oldArray.map(function(val){
return val * 4;
});
map
方法會迭代數(shù)組中的每一個元素,并根據(jù)回調(diào)函數(shù)來處理每一個元素髓帽,最后返回一個新數(shù)組菠赚。注意,這個方法不會改變原始數(shù)組郑藏。
在我們的例子中衡查,回調(diào)函數(shù)只有一個參數(shù),即數(shù)組中元素的值 (val
參數(shù)) 必盖,但其實拌牲,你的回調(diào)函數(shù)也可以支持多個參數(shù),譬如:元素的索引index
歌粥、原始數(shù)組arr
塌忽。
Condense arrays with reduce
數(shù)組方法 reduce
用來迭代一個數(shù)組,并且把它累積到一個值中失驶。
使用 reduce
方法時土居,你要傳入一個回調(diào)函數(shù),這個回調(diào)函數(shù)的參數(shù)是一個 累加器
(比如例子中的 previousVal
) 和當前值 (currentVal
)。
reduce
方法有一個可選的第二參數(shù)擦耀,它可以被用來設(shè)置累加器的初始值棉圈。如果沒有在這定義初始值,那么初始值將變成數(shù)組中的第一項眷蜓,而currentVal
將從數(shù)組的第二項開始分瘾。
下面的例子使用了 reduce
來讓數(shù)組中的所有值相減:
var singleVal = array.reduce(function(previousVal, currentVal) {
return previousVal - currentVal;
}, 0);
Filter Arrays with filter
filter
方法用來迭代一個數(shù)組,并且按給出的條件過濾出符合的元素吁系。
filter
方法傳入一個回調(diào)函數(shù)德召,這個回調(diào)函數(shù)會攜帶一個參數(shù),參數(shù)為當前迭代的項(我們叫它 val
)垮抗。
回調(diào)函數(shù)返回true
的項會保留在數(shù)組中氏捞,返回 false
的項會被過濾出數(shù)組。
下面的代碼示例展示了使用 filter
來移除數(shù)組中值等于5的項:
注意: 我們忽略了第二參數(shù)和第三參數(shù)冒版,因為例子中我們只需要第一參數(shù)就夠了液茎。
array = array.filter(function(val) {
return val !== 5;
});
Sort Arrays with sort
使用sort
方法,你可以很容易的按字母順序或數(shù)字順序?qū)?shù)組中的元素進行排序辞嗡。
與我們之前用的數(shù)組方法僅僅返回一個新數(shù)組不同捆等,sort
方法將改變原數(shù)組,返回被排序后的數(shù)組续室。
sort
可以把比較函數(shù)作為參數(shù)傳入栋烤。比較函數(shù)有返回值,當 a
小于b
挺狰,返回一個負數(shù)明郭;當a
大于b
,返回一個正數(shù)丰泊;相等時返回0薯定。
如果沒有傳入比較函數(shù),它將把值全部轉(zhuǎn)成字符串瞳购,并按照字母順序進行排序话侄。
下面的例子將展示sort
的使用,傳入的比較函數(shù)把元素按照從小到大的順序進行排列:
var array = [1, 12, 21, 2];
array.sort(function(a, b) {
return a - b;
});
Reverse Arrays with reverse
你可以使用 reverse
方法來翻轉(zhuǎn)數(shù)組学赛。
var myArray = [1, 2, 3];
myArray.reverse();
結(jié)果myArray
變成了 [3, 2, 1]
Concatenate Arrays with concat
concat
方法可以用來把兩個數(shù)組的內(nèi)容合并到一個數(shù)組中年堆。
concat
方法的參數(shù)應(yīng)該是一個數(shù)組。參數(shù)中的數(shù)組會拼接在原數(shù)組的后面盏浇,并作為一個新數(shù)組返回变丧。
下面是一個拼接數(shù)組的例子,用concat
把otherArray
拼接在 oldArray
的后面:
newArray = oldArray.concat(otherArray);
Split Strings with split
你可以使用split
方法按指定分隔符將字符串分割為數(shù)組绢掰。
你要給 split
方法傳遞一個參數(shù)锄贷,這個參數(shù)將會作為一個分隔符译蒂。
下面的例子展示了split
方法的使用,按照 s
字母進行分割:
var array = string.split('s');
Join Strings with join
我們還可以使用join
方法來把數(shù)組轉(zhuǎn)換成字符串谊却,里面的每一個元素可以用你指定的連接符來連接起來柔昼,這個連接符就是你要傳入的參數(shù)。
下面展示了使用join
來將數(shù)組中的每一項放入字符串炎辨,并用 and
進行連接:
var veggies = ["Celery", "Radish", "Carrot", "Potato"];
var salad = veggies.join(" and ");
console.log(salad); // "Celery and Radish and Carrot and Potato"