JS 建立物件

xuanxuanQueen發表於2019-08-16

物件直接量

物件直接量是由若干個鍵值對組成的對映表,鍵值對中間用冒號分隔,鍵值對之間用逗號分隔,整個對映表用花括號括起來。

var point = { x:0, y:0 };
var book = {
    "main title": "javascript",
    'sub-title': "the definitive guide",
    author: {
        firstname: "su",
        surname: "yang"
    }
}

透過new建立物件

new運算子建立並初始化一個新物件。關鍵字new後跟一個函式呼叫。這裡的函式稱作建構函式(constructor),建構函式用以初始化一個新建立的物件。JS語言核心中的原始型別都包含內建建構函式。

var o = new Object();        //建立一個空物件,和{}一樣
var a = new Array();     //建立一個空陣列,和[]一樣
var d = new Date();       //建立一個表示當前時間的Date物件
var r = new RegExp("js");       //建立一個可以進行模式匹配的RegExp物件

原型

在將第三種物件建立技術之前,首先了解一下原型。每一個JS物件(null除外)都和另一個物件相關聯。另一個物件就是我們熟知的原型,每一個物件都從原型繼承屬性。

  • 所有透過物件直接量建立的物件都具有同一個原型物件,可以透過Object.prototype獲得對原型物件的引用
  • 透過關鍵字new和建構函式呼叫建立的物件的原型就是建構函式的prototype屬性的值。同使用{}建立物件一樣,透過new Object()建立的物件也繼承自Obeject.prototype,透過new Array()建立的物件的原型就是Array.prototype,透過new Date()建立的物件的原型就是Date.prototype
  • 所有的內建建構函式都距有一個繼承自Object.prototype的原型。比如,Date.prototype的屬性繼承自Object.prototype,因此由new Date()建立的Date物件的屬性同時繼承自Date.prototype和Object。prototype。這一系列連結的原型物件就是所謂的:“原型鏈”。

ES5定義了一個名為Object.create()的方法,它建立一個新物件,第一個引數是這個物件的原型。第二個可選引數,用以對物件的屬性進行進一步描述。

var o1 = Object.create({x:1, y:2});            //o1繼承了屬性x和y
/*
* 可以傳入null來建立一個沒有原型的新物件
* 透過這種方式建立的物件不會繼承任何東西,甚至不包括基礎方法,比如toString()
* 它也不能和“+”運算子一起正常工作
*/
var o2 = Object.create(null);      //o2不繼承任何屬性和方法
/*
*建立一個普通的空物件
*比如透過{}或new Object()建立的物件,需要傳入Object.prototype
*/
var o3 = Object.create(Object.prototype);              //o3和{}和new Object()一樣

可以透過任意原型建立新物件,也就是說,可以使任意物件可繼承。

// inherit() 返回一個繼承自原型物件p的屬性的新物件
// 這裡使用ES5中的Object.create()函式(如果存在的話)
// 如果不存在Object.create(),則退化使用其他方法
function inherit(p) {
    if (p == null) throw TypeError();          //p是一個物件,但不能是null
    if (Object.create)                          //如果Object.create()存在
        return Object.create(p);               //直接使用它
    var t = typeof p;                          //否則進行進一步檢測
    if (t !== "object" && t !== "function") throw TypeError();
    function f() {};                          // 定義一個空建構函式
    f.prototype = p;                        // 將其原型屬性設定為p
    return new f();                           // 使用f()建立p的繼承物件
}
本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章