第?章 - ?向物件編程 1.1什么是?向物件編程? ?向物件是?種編程思想,經常被拿來和?向程序?較,其實說的簡單點,?向程序關注的重點是動詞,是分析出解決問題需要的步驟,然后撰寫函式實作每個步驟,最后依次調?函式,??向物件關注的重點是主謂,是把構成問題的事物拆解為各個物件,?拆解出物件的?的也不是為了實作某個步驟,?是為了描述這個事物在當前問題中的各種?為, 1.2?向物件的特點是什么?
封裝:讓使?物件的?不考慮內部實作,只考慮功能使? 把內部的代碼保護起來,只留出?些 api 接?供?戶使? 繼承:就是為了代碼的復?,從?類上繼承出?些?法和屬性,?類也有??的?些屬性 多型:是不同物件作?于同?操作產?不同的效果,多型的思想實際上是把“想做什么”和“誰去做“分開 ?如下棋的程序, ?向程序是這樣的:開局 ??下棋 棋盤展示 檢查勝負 ??下棋 棋盤展示 檢查 勝負 回圈 ?代碼表示可能是?連串函式的調? init(); whitePlay(); // ??實作?遍下棋的操作 repaint(); // 棋盤展示 check(); blackPlay(); // 再單獨實作?遍下棋的操作 repaint(); // 棋盤展示 check(); ?向物件是這樣的:棋盤.開局 選?.下棋 棋盤.重新展示 棋盤.檢查勝負 選?.下棋 棋盤.重新展示 棋盤.檢查勝負 ?代碼表示可能是這樣的 const checkerBoard = new CheckerBoard(); // CheckerBoard 類內部封賬了棋盤的操作,? 如初始化棋盤,檢查勝負關系等 const whitePlayer = new Player(‘white’); // Player 類內部封裝了各種玩家的操作,?如等待, 落棋,悔棋 const blackPlayer = new Player(‘black’); whitePlayer.start(); // start ?法的結束,內部封裝了或者通過事件發布觸發 checkerBoard.repaint(), checkerBoard.check()的調? blackPlayer.start(); 你只需要調? new ?個 player, 然后調? start ?法,也就是說我們只需要關注?為,?不需 要知道內部到底做了什么, ?且如果要加?些新功能,?如悔棋,?如再加?個玩家,?向物件都很好擴展, 1.3在上?的例?中,?向物件的特性是怎么表現出來的呢? 封裝:Player, CheckerBoard 類,使?的時候并不需要知道內部實作了什么,只需要考慮暴露出的 api 的使? 繼承:whitePlayer 和 blackPlayer 都繼承? Player,都可以直接使? Player 的各種?法和屬性 多型:whitePlayer.start() 和 blackPlayer.start() 下棋的顏?分別是??和?? 1.4Js 中的?向物件 1.4.1物件包含什么? 屬性、方法 1.4.2js內置物件? Object Array Date Function RegExp Math... 1.4.3創建物件 1> 普通方式
// 每?個新物件都要重新寫?遍 color 和 start 的賦值 const Player = new Object(); Player.color = "white"; Player.start = function () { console.log("white下棋"); };
// 2.工廠模式以上這兩種?式都?法識別物件型別,?如 Player 的型別只是 Object 2> 建構式/實體 通過 this 添加的屬性和?法總是指向當前物件的,所以在實體化的時候,通過 this 添加的屬性和?法都會在記憶體中復制?份,這樣就會造成記憶體的浪費,但是這樣創建的好處是即使改變了某?個物件的屬性或?法,不會影響其他的物件(因為每?個物件都是復制的?份)
function createObject() { const Player = new Object(); Player.color = "white"; Player.start = function () { console.log("white下棋"); }; return Player; }
function Player(color) { this.color = color; this.start = function () { console.log(color + "下棋"); }; } const whitePlayer = new Player("white"); const blackPlayer = new Player("black");3> 原型 通過原型繼承的?法并不是?身的,我們要在原型鏈上?層?層的查找,這樣創建的好處是只在記憶體中創建?次,實體化的物件都會指向這個 prototype 物件,
// Tips. 怎么看函式是不是在記憶體中創建了多次呢?
// ?如 2. 建構式中,我們可以看到 whitePlayer.start === blackPlayer.start // 輸出 false
function Player(color) { this.color = color;4. 靜態屬性 是系結在建構式上的屬性?法,需要通過建構式訪問?如我們想看?下?共創建了多少個玩家的實體
} Player.prototype.start = function () { console.log(color + "下棋"); }; const whitePlayer = new Player("white"); const blackPlayer = new Player("black");
function Player(color) { this.color = color; if (!Player.total) { Player.total = 0;// 靜態屬性 } Player.total++;第?章 - 原型及原型鏈 2.1在原型上添加屬性或者?法有什么好處? 剛才已經說過了,如果不通過原型的?式,每?成?個新物件,都會在記憶體中新開辟?塊存盤空間,當物件變多之后,性能會變得很差,但是通過
} let p1 = new Player("white"); console.log(Player.total); // 1 let p2 = new Player("black"); console.log(Player.total); // 2
Player.prototype.xx = function () {}; Player.prototype.xx = function () {}; Player.prototype.xx = function () {};這種?式向原型物件添加屬性或者?法的話,?顯得?常麻煩,所以我們可以這樣寫
Player.prototype = { start: function () { console.log("下棋"); }, revert: function () { console.log("悔棋"); }, };2.2怎么找到 Player 的原型物件?
function Player(color) { this.color = color;....
} Player.prototype.start = function () { console.log(color + "下棋"); };
const whitePlayer = new Player("white"); const blackPlayer = new Player("black");
console.log(blackPlayer.__proto__); // Player {} console.log(Object.getPrototypeOf(blackPlayer)); // Player {},可以通過 // Object.getPrototypeOf來獲取__proto__ console.log(Player.prototype); // Player {} console.log(Player.__proto__); // [Function]
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/393869.html
標籤:其他
