JavaScript基於原型的編程語言,自己並不包含內置的類實現。可是能夠經過Javascript模擬出類java
JavaScript中有構造函數和New運算符。構造函數用來實例對象和初始化屬性。任何JavaScript函數均可以用做構造函數,構造函數必須使用new運算符做爲前綴來建立新的實例編程
JavaScript要模擬一個類能夠直接使用函數function編程語言
var Person = function(name){ this.name = name; } //實例化Person var alice = new Person('alice'); console.log(alice.name);
這裏須要注意的this關鍵字, new運算符會改變函數的執行上下文,同時改變return的行爲。當使用new運算符來調用構造函數時,執行上下文this從全局對象編程一個空的上下文,這個上下文表明新生成的實例。所以this指向當前建立的實例。函數
因此一下代碼執行會出現undefinedthis
var bob = Person('bob'); console.log(bob.name);
JavaScript自己是基於原型的編程語言,原型的做用:區別類和實例spa
var Animal = function(){} Animal.run = function(){ console.log('Animal run') } Animal.prototype.breath = function(){ console.log('animal breath'); } Var Dog = function(){} //Dog繼承自Animal Dog.prototype = new Animal(); Dog.prototype.wag = function(){ console.log('dog wag'); } var dog = new Dog(); dog.wag(); dog.breath();//繼承的屬性
輸出:prototype
dog wag animal breath
那麼經過類的prototype定義的方法或者屬性就能夠叫作全部實例的方法或屬性,而其餘的方法和屬性就是類自己的方法和屬性類比java類中的靜態變量code
這裏對下面一些東西的叫法約定一下對象
一般按照我的習慣繼承
構造函數/匿名函數
var Person = function(name){ this.name=name; }
函數/類
function Person(){}
對象/實例
var person = { name:'zhangsan',sex:'male'}
仍是上面關於Animal和Dog的例子,咱們作一些改造
var animal = { breath:function(){console.log('animal breath!')}, }; var Dog = function(){} //Dog繼承自animal Dog.prototype = animal; Dog.prototype.wag = function(){ console.log('dog wag'); } var dog = new Dog(); dog.wag(); dog.breath();//繼承的屬性
結果和上面的同樣
在一個例子中咱們使用 Dog.prototype = new Animail; 這個例子中咱們使用的是Dog.prototype = animal
區別在於第一個例子中的Animal是一個匿名類,經過調用new運算符調用其構造函數返回了一個animal實例,而第二個例子中animal自己就已是一個實例/對象。這就是以前提到的new運算符的做用。
因此一個類的若是要繼承另外一個類那麼就須要繼承那個類的實例而不是類自己(Function),固然咱們能夠試一下直接使用Dog.prototype=Animal,結果就是當調用dog.breath();時直接返回的是一個Function對象,沒法達到共享屬性的意義。
原型對象就是一個「模板」,定義在原型上的屬性被用來初始化一個新的對象。任何對象均可以做爲一個對象的原型對象,以此來共享屬性。