對象是js的基本數據類型,準確來講除了字符串,數字,boolean值,null與undifine以外,js中的值都是對象。js中的對象是一種複合值,他將不少值(原始值或其餘對象)聚合在一塊兒,能夠經過名字來訪問這些值,其實看上去就像是一個屬性的無序集合,每一個屬性都是一個名/值對。屬性名是字符串,能夠把對象當作是從字符串到值得映射。這種現象就像咱們平時知道的「關聯數組」,「數據字典」等等(只是叫法不一樣而已)。除了這種映射關係外,最主要的核心就是js的對象能夠經過「原型繼承」來繼承屬性與方法。另外因爲對象時可變的,咱們是經過引用而非值來操做對象。html
var empty = {}; // 定義一個空對象 var ob1 = {x:1,y:2}; // 定義兩個屬性的對象 var ob2 = { // 定義複雜的對象 "main title" : "three object", "main-t" : 123, // 特殊字符要加引號 "for" : {x:"123",y:123}, // for是保留字必須用引號 };
var arr = new Array(); // 使用內置構造函數建立一個新的數組對象,至關於var arr = []; var obg = new Object(); // 使用內置構造函數建立一個新的數組對象,至關於var arr = {}; function UserDefineObj (x,y) { // 自定義的構造函數 this.x = x; this.y = y; } var user = new UserDefineObj(1,2); // 使用自定義的構造函數建立一個對象
var ob1 = Object.create ( {x : 1, y : 2 } ); // 使用後面的參數(對象直接量)做爲ob1對象的原型。
若是想建立一個空對象(好比經過{ }或newObject()建立的對象)可使用Object.prototype做爲這個方法的參數。例如:正則表達式
var ob2 = Object.create ( { } ) ; // 建立一個空對象
若是傳入參數爲null,將會建立一個沒有任何原型的空對象,但這個對象沒有任何繼承的方法,甚至不包括基礎的方法,如toString()等。json
var ob3 = Object.create (null); // ob3不繼承任何屬性和方法
function UserDefineObj (x,y) { // 自定義的構造函數 this.x = x; this.y = y; } var user = new UserDefineObj(1,2); // 使用自定義的構造函數建立一個對象 console.log(user.toString()); // toString這個方法就是繼承自Object.prototype
關於原型與原型鏈推薦博客:http://www.cnblogs.com/TomXu/archive/2012/01/05/2305453.html數組
function UserDefineObj (x,y) { // 自定義的構造函數 this.x = x; // 聲明自定義屬性x,也成爲自有屬性 this.y = y; // 聲明自定義屬性y } UserDefineObj.prototype.allx = 123; // 給構造函數的原型對象添加屬性allx var user = new UserDefineObj(1,2); // 使用自定義的構造函數建立一個對象 console.log(user.x); // 輸出:1 console.log(user.allx); // 輸出:123
因爲js是一種弱類型的語言,在不聲明變量的狀況下,解析器會自動的再運行的時候建立這個變量(全局變量)。函數
function UserDefineObj (x,y) { // 自定義的構造函數 this.x = x; // 聲明自定義屬性x,也成爲自有屬性 this.y = y; // 聲明自定義屬性y } UserDefineObj.prototype.allx = 123; // 給構造函數的原型對象添加屬性allx var user = new UserDefineObj(1,2); // 使用自定義的構造函數建立一個對象 var ob = new UserDefineObj(4,5); console.log(user.x); // 輸出:1 console.log(ob.x); // 輸出:4 console.log(user.allx); // 輸出:123 console.log(ob.allx); // 輸出:123 user.allx = 110; // 更改user對象的屬性,對ob對象沒有影響 console.log(user.allx); // 輸出:110 console.log(ob.allx); // 輸出:123
從上面程序的輸出能夠看出user對象和ob對象建立了兩個不一樣的對象,這兩個對象同時共同繼承自原型對象UserDefineObj.prototype。因爲是不一樣的對象,因此對屬性的值得改變,對其餘的對象沒有影響。this