JS字面量和構(gòu)造函數(shù)
1.總體說明
- 盡量避免使用構(gòu)造函數(shù)
- 按需創(chuàng)建對象方式档玻,最適合選擇字面量
2.字面量語法
- 對象包裝在大括號中
- 屬性和方法,按照 名稱-值 的方式茫藏,并以逗號區(qū)分误趴。【注意:最后一個逗號不要加务傲,IE不兼容】
- 用冒號來分割名稱和值
- 賦值后右大括號后要有分號
格式如下:
var objectName = {
propName: value,
methodName: function(){
//todo
}
};
3.構(gòu)造函數(shù)實質(zhì)
- JS并沒有類的概念凉当,只是使用函數(shù)實現(xiàn)了類的用法
- 不要使用
new Object(value)
的構(gòu)造函數(shù)枣申,其動態(tài)決定創(chuàng)建值的類型,會造成意外的后果
構(gòu)造函數(shù)的實質(zhì):
var Constructor = function(value){
this.propName = value;
this.methodName = function(){
//todo
}
}
等價于下述過程(并非實際情況):
var Constructor = function(value){
//使用字面量創(chuàng)建空對象
//var this = {};
//添加屬性和方法
this.propName = value;
this.methodName = function(){
//todo
}
//返回該字面量
//return this;
}
【說明】
- 由上述實質(zhì)可以說明看杭,在構(gòu)造函數(shù)中可以返回其他對象值忠藤,用來代替this,但必須是對象值,否則仍然返回this
- 實際情況中this并非為{}泊窘,而是從其他prototype創(chuàng)建而來
- 如果構(gòu)造函數(shù)不使用new來操作熄驼,則內(nèi)部的this會指向全局變量,后果意想不到
4.一種安全的構(gòu)造函數(shù)模式
為防止丟失new操作符而導(dǎo)致的構(gòu)造函數(shù)誤用烘豹,可使用以下方式創(chuàng)建構(gòu)造函數(shù):
var Constructor = function(value){
//自調(diào)用構(gòu)造函數(shù):方式一
if(!this instanceof Constructor){
return new Constructor();
}
//自調(diào)用構(gòu)造函數(shù):方式二 嚴格模式下不支持
if(!(this instanceof arguments.callee)){
return new arguments.callee();
}
this.propName = value;
this.methodName = function(){
//todo
}
}
5.數(shù)組的構(gòu)造函數(shù)
數(shù)組采用字面量構(gòu)造和構(gòu)造函數(shù)等同:
var arrayName = new Array(value1, value2, value3 ...);
等同于
var arrayName = [value1, value2, value3 ...];
【構(gòu)造函數(shù)的問題】
如果使用數(shù)組的構(gòu)造函數(shù)瓜贾,則會有如下問題:
//生成長度為n的數(shù)組
var arrayName = new Array(n);
//arrayName[k] 對于數(shù)組中的元素為 undefined
【檢查數(shù)組屬性】
- 使用typeof操作符,返回object
- 使用
Array.isArray()
方法携悯,但部分環(huán)境無法使用 - 自定義方法:
if(typeof Array.isArray === "undefined"){
Array.isArray = function(arg){
return Object.prototype.toString.call(arg) === "[object Array]";
}
}
6.JSON數(shù)據(jù)
- JSON和字面量對象的區(qū)別:JSON是鍵-值對祭芦,但鍵名稱必須為字符串(使用引號包裝)
- JSON數(shù)據(jù)的解析與序列化
//解析
var objectName = JSON.parse(jsonString);
//序列化
var jsonString = JSON.stringify(objectName);
7.正則表達式
構(gòu)造函數(shù)生成:
var re = new RegExp(regexString,option);
//option: "g" "m" "i"組合
【說明】:
- 正則表達式需要進行轉(zhuǎn)義,難以閱讀
- 是否使用new操作符都可以
字面量生成:
var re = /regexString/option
//option: g m i 組合憔鬼,直接跟在后面
【說明】
- 在以前的版本中龟劲,一個字面量創(chuàng)建后,后面返回的對象都相同轴或,新版本已經(jīng)更改
8.錯誤對象
內(nèi)置的錯誤對象,均可以通過構(gòu)造函數(shù)創(chuàng)建:
- Error()
- SyntaxError()
- TypeError()
內(nèi)置對象均有以下兩個屬性: - name :錯誤名稱昌跌,一般就是構(gòu)造函數(shù)的名稱
- message :創(chuàng)建對象時附帶的消息
【自定義錯誤對象】
通過throw拋出任意對象,因此可以創(chuàng)建自定義對象
try{
throw{
name:value,
message:value,
propName:value,
methodName:function
};
} catch(e){
//todo
}