1、經過對象直接量來建立javascript
var emptyt={}; //至關於var empty=new Object;java
//若是屬性名中包含空格、連字符(-)、還有關鍵字,保留字時,要用字符串表示web
var book={數組
「main title」:「javascript」, ide
「sub-title」:「The Definitive Guide」, //屬性名包含連字符函數
「for」:「all audiences」, //屬性名包含保留字ui
author:{this
firstname:「David」,spa
surname:「Flanagan」,prototype
}
}
2、經過new+構造函數建立對象
構造函數能夠是js中的內置構造函數和自定義的構造函數
var o=new Object();//建立一個空對象 和{}同樣
var a=new Array();//建立一個空數組和[]同樣
var d=new Date();//建立一個表示當前時間的對象
var r=new RegExp(‘js’);//建立一個能夠進行模式匹配的RegExp對象
3、Object.create()建立對象
Object.creat()是一個靜態函數,不是提供給某個對象調用的方法,使用時,須要傳遞原型對象(及要繼承的對象),第二個參數可選,用以對對象的屬性進行進一步描述。
var o1=Object.create({x:1,y:2}); //o1繼承了屬性x和y
能夠經過傳入參數null建立一個沒有原型對象的新對象,經過這種方式建立的對象不繼承任何東西
var o2=Object.create(null);//o2不繼承任何屬性和方法
若是想建立一個普通的空對象(好比經過{ }或者new Object()建立的對象);須要傳入Object.prototype;
var o3=Object.create(Object.prototype); //o3和{}、new Object同樣
四、工廠模式
工廠模式很是直觀,將建立對象的過程抽象爲一個函數,用函數封裝以特定接口建立對象的細節,通俗的講,工廠模式就是將建立對象的語句放在一個函數裏面,經過傳入參數來建立特定對象,最後返回建立的對象,工廠模式雖然能夠建立多個類似的對象,可是不能解決對象標識的問題,即知道一個對象的類型。
function createStudent(name,sex,grade)
{
var o=new Object( );
o.name=name;
o.sex=sex;
o.grade=grade;
o.sayName=function()
{
console.log(this.name)
}
return o;
}
var s1=createStudent(「david」,「女」,「15」);
5、構造函數模式
像Object和Array這樣的原生構造函數,在運行時會自動出如今執行環境。此外,也能夠建立自定義的構造函數,從而定義自定義對象類型的屬性和方法。
function Student(name,sex,grade)
{
this.name=name;
this.sex=sex;
this.grade=grade;
this.sayName=function()
{
console.log(this.name);
}
}
var s1=new Student(「we」,「女」,「17」);
注意:構造函數的首寫字母必須大寫,以便與普通函數區分開來。
此外要注意,要建立Student的實例,必須使用new操做符,建立的實例對象將有一個constructor(構造器屬性),指向Person構造函數。
調用構造函數建立對象主要經歷了下面幾個步驟:
一、建立一個新對象;
二、把構造函數的做用域賦給新的對象(所以this就是指向新的對象實例);
三、執行構造函數中的代碼;
四、返回新對象;
構贊函數的缺點:
每一個方法都要在每一個實例上面建立一遍,函數便是對象,所以每定義一個函數,也就實例化了一個對象。因此調用同一個構造函數所建立的不一樣實例對象中的方法是不相等的。
var s3 = new Student('唐僧','male',3);
var s4 = new Student('白骨精','female',4);
s3.sayName();
s4.sayName();
console.log(s3.sayName == s4.sayName); //結果爲false 因此兩個方法是兩個不一樣的方法
6、原型模式
js中,每一個對象都有一個prototype屬性,原型對象,原型對象包含了能夠由特定類型的全部實例對象的共享的屬性和方法。
使用原型模型可讓全部的實例對象共享原型對象中的屬性和方法。
function Student_1(){
}
Student_1.prototype={
name:「wangyue」,
sex:「女」,
class:5,
sayName:function()
{
console.log(this.name)
}
}
var s1=new Student_1();
var s2=new Student_2();
console.log(s1.sayName==s2.sayName);
瞭解原型後能夠繼續在實例對象上面添加屬性和方法;
s1.name=「john」;
console.log(s1.name);打印出來是john;
當要讀取某個對象的屬性時,都會執行一次搜索,搜索首先從對象實例自己開始,若是在實例中找到了這個屬性,則搜索結束,返回實例屬性的值;若實例上沒有找到,則繼續向對象的原型對象延伸,搜索對象的原型對象,若在原型對象上找到了,則返回原型上相應屬性的值,若沒有找到,則返回undefined。所以,實例對象屬性會覆蓋原型對象上的同名屬性,因此上面第二行代碼輸出的是John。
Object.getPrototypeOf(object)方法返回參數對象的原型對象。
Object.keys(object)方法返回對象上可枚舉的實例屬性。
Student_1.prototype.friends = ['aa','bb'];
console.log('s6的朋友' + s6.friends);
s5.friends.push('cc');
console.log('s5的朋友' + s5.friends);
console.log('s6的朋友' + s6.friends);
問題來了,咱們只想改變s5的朋友列表,但因爲原型模式的共享本質,s6的朋友列表也隨之改變了。所以,不多單獨使用原型模式。
7、組合使用構造函數和原型模式
構造函數模式用於定義實例屬性,原型模式則用於定義方法和共享的屬性。這種混合模式不只支持向構造函數傳入參數,還最大限度地節約了內存,可謂是集兩模式之長。示例代碼以下:
function Student(name,sex,grade){
this.name = name;
this.sex = sex;
this.grade = grade;
}
Student.prototype.sayName = function(){
console.log(this.name);
}
Student.prototype.school = 'Joooh school';
除了以上幾種常見的模式外,批量建立對象的方式還有
動態原型模式:僅在第一次調用構造函數時,將方法賦給原型對象的相應屬性,其餘示例的處理方式同構造函數模式
寄生構造函數模式:僅僅封裝建立對象的代碼,而後再返回新建立的對象,仍使用new操做符調用
穩妥構造函數模式:沒有公共屬性,只有私有變量和方法,以及一些get/set方法,用以處理私有變量。