概述javascript
JavaScript自己並不是面向對象(不支持「class」關鍵字),只能經過其自己的一些特性來模擬面向對象編程。java
主要分爲兩大類:編程
1,原始對象方式;json
2,構造函數方式(推薦)。函數
原始對象方式this
直接使用json:prototype
var Dog = { name : ''; color : '' }; var dog1 = {}; dog1.name = "dog1"; dog1.color = "yellow"; var dog2 = {}; dog2.name = "dog2"; dog2.color = "blue";
這類方式有2個缺點:1,原型與實例對象之間關係不明顯(dog1與dog2很難看出是Dog的實例);2,語法很是囉嗦。對象
爲了解決語法囉嗦的問題,可使用如下方式:blog
function Dog(name, color) { return { name : name, color : color } } var dog1 = Dog("dog1", 'yellow'); var dog2 = Dog("dog2", "blue");
此類方式仍舊存在缺點1。繼承
構造函數方式
原型對象方式存在以上的問題,JavaScript提供構造器方式。
構造器:形式上還是一個function,但其內部含有this關鍵字,可使用new 關鍵字調用構造器生成實例。
使用構造器修改以前的代碼:
function Dog(name, color) { this.name = name; this.color = color; } Dog.prototype.eat = function (){ alert("eat something"); }; Dog.prototype.type = "dog"; var dog1 = new Dog("dog1", "yellow"); var dog2 = new Dog("dog2", "blue");
這裏要說明的是prototype關鍵字,以上代碼中
Dog.prototype.eat = function (){ alert("eat something"); }; Dog.prototype.type = "dog";
可使用this關鍵字代替:
this.type = "dog"; this.eat = function(){alert(「eat something");};
可是this關鍵字方式存在一個問題:每一個實例都會從新生成type及eat,但咱們看到,對於type及eat每一個實例的內容都是同樣的,因此這樣就形成了內存的浪費。
有沒有方式能夠解決這個問題呢?有,那就是使用prototype關鍵字。
prototype關鍵字:每一個構造器均可以使用prototype,它指向另外一個對象,此對象的屬性和方法會被該構造器的實例繼承。
總結:
1,原型對象方式可能存在」原型與實例對象之間關係不明顯「、」語法囉嗦「的問題;
2,構造器方式是推薦的方式,使用this關鍵字聲明屬性和方法,new關鍵字生成實例化對象;
3,若構造器方式中含有一致的方法或屬性,可使用prototype關鍵字節約內存。