js關於字面量與構造函數創建對象的幾點理解

轉載自:http://my.oschina.net/bothyan/blog/125668

一、在javascript中沒有所謂的空對象,即使最簡單的{}也具有從Object.prototype繼承的方法和屬性。

二、創建的對象的倆種等價的方法:使用字面量方法創建對象:var oschina = {goes:"far"};  使用內置構造函數創建對象:var oschina = new Object();  car.gose = "far"。我們應該儘量使用字面量發創建對象,其顯著優點在於它僅僅輸入更短的字符。但是選擇它還有以下幾個更重要的原因:

1、選擇字面量法創建對象強調該對象僅是一個可變的hash映射,而不是從對象中提取的屬性或方法。

2、對使用Object構造函數相對,使用字面量在於它並沒有作用域解析。因爲可能以同樣的名字創建一個局部函數,解釋器需要從調用Object(0的位置開始一直向上查詢作用域鏈,知道發現全局Object構造函數。

3、構造函數Object可以僅接受一個參數,並且還依賴傳遞的值,該OBject()可能會委派另一個內置函數來創建對象,並且返回了一個並非期望的不同對象。如將數字、字符串、布爾值當做參數傳遞給Object構造函數,其結果是獲得了以不同構造函數所創建的對象,例如:var oschina = new Object(1);ochina.constructor爲Number;傳遞的值是動態的,直到運行時才確定其類型,這種行爲會導致意想不到的結果。

三、構造函數仍然是函數,但它需要用new操作符調用,若忘記用new操作符會導致構造函數中的this指向全局對象

(瀏覽器中指向window),如下面代碼:

function  abc(){
 this.after = "def";
}
//定義對象
var oschina = new abc();
alert(typeof oschina); //'object'
alert(oschina.after);//'def';

var oschina = abc();
alert(typeof oschina); //'undefined'
alert(window.after);//'def';

四、檢查數組性質。當數組作爲操作數並使用typeof操作符時,其結果會返回"object",因爲數組也是對象。但是這對於排除錯誤沒有什麼幫助,通常我們需要知道某個值是否爲一個數組。有時候檢查代碼可以用是否存在length屬性或一些數組方法,但是這些檢查並非萬能,我們無法確定一個非數組對象就不能擁有這些屬性和方法。還可以使用instanceof Array進行檢查,但是這種檢查存在兼容性問題。

ECMAScript 定義了Array.isArray(),方法,接受參數爲數組時返回true。但是有些環境不支持這種方法,最好的檢查數組性質的方法是Object.prototype.toString.call方法,若是數組會返回[object Array],若是對象則爲[object object]。因此要用如下方法檢測:

if(typeof Array.isArray === "undefined"){
  Array.isArray = function(arg){
     return Object.prototype.toString.call(arg) === "[object Array]";
  };
}
//調用Array.isArray()

五、在一般情況下,除了Date()構造函數以外,很少需要用其他內置構造函數。
發佈了9 篇原創文章 · 獲贊 0 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章