對於靜態的類來講,JavaScript 對象直接量就已經夠用了,但使用繼承和實例來建立經典的類每每更有幫助。javascript
JavaScript 是基於原型的編程語言,並無包含內置類的實現。java
但經過JavaScript 能夠輕易地模擬出經典的類。編程
JavaScript 中有構造函數和 new 運算符。構造函數用來給實例對象初始化屬性和值。任何JavaScript 函數均可以用作構造函數,構造函數必須使用 new 運算符做爲前綴來建立新的實例。app
new 運算符改變了函數的執行上下文,同時改變了return 語句的行爲。編程語言
當使用 new 關鍵字來調用構造函數時,執行上下文從全局對象(window)變成一個空的上下文{}
,這個上下文表明瞭新生成的實例。所以,this 關鍵字指向當前建立的實例。若是構造函數沒有返回值,那麼這個新生成的實例就做爲默認的返回值。若是指定了返回值,這個新實例就白白浪費了。函數
var Person = function(name) { this.name = name; }; // 實例化一個Person var alice = new Person('zhang'); if .. 這樣 Person('ben dan'); //=> undefined
上面這個例子說明了 new 與不 new 的區別。這個函數只會返回undefined,而且執行上下文是window(全局)對象,無心間建立了一個全局變量name。ui
/** * Class build my Own class * Created by cyk on 14-8-19. */ var Class = function() { "use strict"; // in current line, 'this' is : Class {} 對象實例 // in the finally, as we have a return value ,so the Class {} is unused. // 這樣的作法每次都會產生一個'新的' klass 字面量方法 var klass = function() { // this 均是上下文中新生成的實例 this.init.apply(this, arguments); }; klass.prototype.init = function() {}; // 定義 prototype 的別名 klass.fn = klass.prototype; // 定義類的別名 klass.fn.parent = klass; // 給類添加屬性 klass.extend = function ( obj ) { // 可選的回調方法 extended var extended = obj.extended; for( var i in obj ) { klass[i] = obj[i]; } if (extended) extended(klass); }; // 給實例添加屬性 klass.include = function ( obj ) { // 可選的回調方法 var included = obj.included; for( var i in obj ){ klass.fn[i] = obj[i]; } if (included) included(klass); }; /* * 這裏的實現支持extended 和included 回調。 * 將屬性傳入對象後就會觸發這兩回調函數 */ return klass; }; var ORMModule = { save: function () { "use strict"; // 共享的函數 } }; var Person = new Class(); // 雖然和上一行代碼同樣,可是得到的值倒是新 new 出來的, // 全部 Asset 和 Person 指向的都是 Class 的不一樣變量,只是變量內容類似罷了 var Asset = new Class(); // 因此 Person 和 Asset 如今指向的並不是同一個變量 Person.include(ORMModule); Asset.include(ORMModule); Person.include({ find: function() { console.log(this); } }); // person is : Class instance, // klass {init: function, parent: function, save: function, find: function} var person = new Person(); var asset = new Asset(); person.find(); // klass asset.find(); // undefined is not a function
先到這裏,下集不見不看。this