JS面向對象 constructor:對象的構造器(構造函數) // 使用 new 關鍵字建立 var o = new Object(); var a = new Array(); var d = new Date(); | | object constructor // 使用直接量建立 var o = {name: 'Xinyang'}; var a = [1, 2, 3]; 自定義構造器: function Person(name,age,birthdate){ this.name = name; this.age = age; this.birthdate = birthdate; this.changeAge = function(newAge){ this.age = newAge; } } //create object var q = new Person('q',12,new Date(2011,2,1)) var p = new Person('p',34,new Date(2065,03,12)) p.changeAge(12)建立構造器的三種方法:1.function ClassName(){...}2.var class = function(){...}3.var class = new Function(){...}並非全部的函數均可以當成構造器.如var o = Math.min() 一般自定義的函數均可以當成構造器使用.內置對象的構造器亦可當作構造器.若是構造器有返回值,而且是對象類型,則對象將直接返回 function Person(name,age,birthdate){ this.name = name; this.age = age; this.birthdate = birthdate; this.changeAge = function(newAge){ this.age = newAge; } return {}; } var X = new Person('a',22,new Date()) X.name//undefined this關鍵字: this 在不一樣環境中指代的對象不一樣(this 指代的值可在函數運行過程當中發生改變)。 全局環境中:this指代全局對象window var val = 10 alert(this.val) 構造器中:this指代將被構造出來的對象 函數中:指代函數的調用者 NOTE: new Function('console.log(this)') 中的 this 均指代全局對象。 eval('console.log(this) 則爲調用上下文指代的 this。 this實例:使用 apply 與 call。經過這兩個方法來將一個對象中 this 指代的目標進行改變。 function Point(x, y) { this.x = x; this.y = y; this.move = function(x, y) { this.x += x; this.y += y; } } var point = new Point(0, 0); point.move(1, 1); var circle = {x: 0, y: 1, r: 1};// 改變 point 中 move 方法 this 指代的對象至 circle point.move.apply(circle, [1, 1]);// 一樣能夠用相似的 call 方法,區別爲參數需依次傳入 point.move.call(circle, 1, 1);原型繼承prototype function Boss() { this.age = 0; this.birthdate = null; this.name = ''; this.tasks = []; } Boss.prototype = { title: 'Boss', gretting: function(){console.log('I am a Boss!');} } var X = new Boss(); var Q = new Boss();// X 與 Q 中具備徹底一致(沒必要惟一的屬性或方法)// 並耗用內存的共享部分// this.title 與 this.gretting var X = new Boss(); var Q = new Boss(); // X 與 Q 擁有相同的原型 Boss.prototype 原型鏈 使用原型繼承的方法會產生原型鏈。JavaScript 中對於對象的查找、修改和刪除都是經過原型鏈來完成的。 判斷屬性是否爲對象自己 objectName.hasOwnProperty('propertyName'); // 返回布爾值 true 或 false 屬性查找 對象的屬性查找會更隨原型鏈依次查找,若是在當前環境中沒法找到須要的屬性則會繼續向下一層原型中繼續尋找。 屬性修改 在 JavaScript 中對於對象屬性的修改永遠只修改對象自身的屬性(不管是來源於對象自己仍是對象的原型)。當建立當前對象不存在屬性時(即使原型擁有此屬性),也會爲此對象增長改屬性。 修改原型上的屬性 修改原型屬性會印象全部被建立出的對象現有的屬性和方法。 ClassName.prototype.propertyName = 'new value'; ClassName.prototype.methodName = function(){...}; 屬性刪除 delete objectName.propertyName 只可刪除對象自身的屬性,沒法刪除對象的原型屬性。Object.create(proto[, propertiesObject]) 其爲ECMAScript 5 中提出的新創建對象的方式。在 X 中使用隱式的原型對象指向 boss 對象,並將其設爲 X 對象的原型。var boss = { title: 'Boss', gretting: function(){console.log('Hi, I am a Boss!');}}; var X = Object.create(boss); X.gretting(); // Hi, I am a Boss! 低版本中實現 Object.create 功能 此種方式仍需使用 ClassName.prototype 的方式來實現。var clone = (function(){ var F = function(){}; return function(proto) { F.prototype = proto; return new F(); }})(); 面向對象的應用 全局變量 全局變量可在程序任意位置進行訪問和修改的變量。濫用全局變量會致使,命名衝突,致使程序不穩定。 全局標量的三種定義方法: var gloablVal = 'value'; 。 window.gloablVal = 'value'; 附加於 window 對象上 gloablVal = 'value'; 不使用 var 關鍵字,也附加於 windwo 對象 NOTE:delete 沒法刪除在代碼最頂端定義的全局標量 var globale 封裝 信息隱藏能夠保證程序的穩定,將內部信息進行隱藏。其餘語言中可詞用訪問權限來實現封裝的概念,像 private、public。 JavaScript 中的封裝可以使用函數的方法(閉包)。