每一個對象的建立都基於引用類型,好比:javascript
<script> var str = new String("beckham"); </script>
咱們能夠建立自定義對象,最簡單的方法就是建立一個Object的實例,好比:java
<script> var person = new Person(); person.name = "Nicholas"; person.age = 29; person.callName = function(){ alert(this.name); } </script>
上面的例子建立了名爲person的對象,並添加了3個屬性。函數
1.建立對象有多種方法,上述的一種,屬於Object構造函數。
2.此外,還能夠用字面量對象建立一個函數,以下:this
<script> var person = { name : "Nicholas", age : 29, callName : function(){ alert(this.name); } }; alert(person.name); //"Nicholas" </script>
3.藍後,是第三種,用工廠模式 建立,以下:spa
<script> function person(name,age,callName){ var o = new Object(); o.name=name; o.age=31; o.callName=function() { alert(this.name); }; return o; } var person1 = person("Nicholas",29); </script>
person()函數會根據接收的參數建立一個包含全部信息的對象。可是這種方法因爲沒有解決對象識別的問題(直到對象的類型),並很差~
接下來的一種方法就是下面重點介紹的:自定義構造函數。prototype
與上述的構造函數不一樣,用Object、Array之類的構造函數被稱爲原生構造函數。自定義構造函數能夠自定義對象的屬性和方法。構造函數就是初始化一個實例對象。
讓咱們來看一個栗子~指針
<script> function Person(name,age,job){ this.name=name; this.age=age; this.job=job; this.sayName=function() { alert(this.name); }; } var person1 = new Person("Nicholas",29,"engineer"); alert(person1.name); //"Nicholas" </script>
注意~構造函數有一個特色,默認函數首字母大寫。在上面的栗子中,person1就是Person對象的一個實例。person1有一個constructor的屬性,指向Personcode
咱們建立的每個函數都有一個prototype屬性,這個屬性是一個指針,指向一個對象,這個對象包含了由特定類型全部實例共享的屬性和方法。咱們能夠說Person.prototype是person1的原型對象。因此,Person.prototype更像是一個模型和中轉站。讓咱們看下面的栗子:對象
<script> function Person(){}; person.prototype.name = "Nicholas"; person.prototype.age = 29; person.prototype.job = "engineer"; person.prototype.callName = function(){ alert(this.name); }; var person1 = new Person(); person1.callName(); //"Nicholas" </script>
如上,咱們將callName()方法和全部的屬性添加到了Person的prototype屬性中。Person.prototype是一個第三者,Person和person1其實是沒有連接的,他們二者的聯繫是經過Person.prototype來創建的,而它裏面會保存包括name、age、job等屬性和callName()方法。或許經過下面這個圖更好理解。blog
咱們可能會以爲每次都要寫一遍Person.prototype會比較麻煩,因此咱們能夠用字面量的方式:
<script> function Person(){}; Person.prototype = { name : "Nicholas", age : 29, job : "engineer", sayName : function(){ alert(this.name); } }; var person1 = new Person(); </script>
上面的代碼最終的執行結果也是同樣的,只是一點不一樣:constructor再也不指向Person了。