[Effective JavaScript 筆記]第39條:不要重用父類的屬性名

来源:http://www.cnblogs.com/wengxuesong/archive/2016/06/17/5594476.html
-Advertisement-
Play Games

這個時候,首先調用Alien構造函數運行,創建一個空對象alien,把構造函數中的this綁定到alien上,然後運行Actor.call(alien,scene,0,0)產生了alien.id=++Actor.nextID,然後添加其它私有屬性,但當又遇到id這個屬性的時候,alien.id=++... ...


假設想給上節講的場景圖庫添加收集診斷信息的功能。這對於調試和性能分析很有用。

38條示例

給每個Actor實例一個唯一的標識數。

添加標識數

function Actor(scene,x,y){
  this.scene=scene;
  this.x=x;
  this.y=y;
  this.id=++Actor.nextID;
  scene.register(this);
}
Actor.nextID=0;

現在我們需要對Actor的子類做同樣的事。假設,Alien類代表太空飛船的敵人。除了其角色標識數外,我們希望每個外星人都有一個單獨標識數。

function Alien(scene,x,y,direction,speed,strength){
  Actor.call(this,scene,x,y);
  this.direction=direction;
  this.speed=speed;
  this.strength=0;
  this.damage=0;
  this.id=++ Alien.nextID;
}
Alien.nextID=0;

這裡導致Alien類與其父類Actor之間衝突。兩個類都試圖給實例屬性id寫數據。雖然每個類都認為該屬性是“私有”的(即只有直接定義在該類中的方法才能獲取該屬性),然而事實是該屬性存儲在實例對象上並命名為一個字元串。如果在繼承體系中的兩個類指向相同的屬性名,那麼它們指向的是同一個屬性。

執行

當我們調用下麵這個代碼來看一下,上面的執行過程。

var alien=new Alien(scene,0,0,'lt',100,10);

這個時候,首先調用Alien構造函數運行,創建一個空對象alien,把構造函數中的this綁定到alien上,然後運行Actor.call(alien,scene,0,0)產生了alien.id=++Actor.nextID,然後添加其它私有屬性,但當又遇到id這個屬性的時候,alien.id=++Alien.nextID,把上面從基類構造函數產生的id進行了修改。這個時候,id的屬性就產生了歧義。

修正

因此,子類必須始終留意其父類使用的所有屬性,即使那些屬性在概念上是私有的。該例子顯而易見的解決方法是對Actor標識數和Alien標識數使用不同的屬性名。

function Actor(scene,x,y){
  this.scene=scene;
  this.x=x;
  this.y=y;
  this.id=++Actor.nextID;
  scene.register(this);
}
Actor.nextID=0;

function Alien(scene,x,y,direction,speed,strength){
  Actor.call(this,scene,x,y);
  this.direction=direction;
  this.speed=speed;
  this.strength=0;
  this.damage=0;
  this.alienID=++ Alien.nextID;
}
Alien.nextID=0;

提示

  • 留意父類使用的所有屬性名

  • 不要在子類中重用父類的屬性名

附錄:完整結構關係圖

下麵是一張38條和39條里添加標識符後,所有類之間的關係圖。
1466152749159


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 寫了關於Hadoop的Map側join 和Reduce的join,今天我們就來在看另外一種比較中立的Join。 SemiJoin,一般稱為半鏈接,其原理是在Map側過濾掉了一些不需要join的數據,從而大大減少了reduce的shffule時間,因為我們知道,如果僅僅使用Reduce側連接,那麼如果 ...
  • 最近在開發過程中,遇到了一個場景,甚是棘手,在這裡分享一下。希望大家腦洞大開一起來想一下解決思路。鄙人也想了一個方案拿出來和大家一起探討一下是否合理。 一、簡單介紹一下涉及的對象概念 工作單元:維護變化的對象列表,在整塊業務邏輯處理完全之後一次性寫入到資料庫中。 領域事件:領域對象本身發生某些變化時 ...
  • jsp主要就是用之前的jsonArray讀取 ajax可以設置個定時器,然後設置的方法,至於方法是今天學習到的 function ajax(method,data,url,success){ var xhr=null; try{ xhr=new XMLHttpRequest("Microsoft.X ...
  • 背景:angular與jquery類庫的協作 第三方類庫中,不得不提的是大名鼎鼎的jquery,現在基本上已經是國內web開發的必修工具了。它靈活的dom操作,讓很多web開發人員欲罷不能。再加上已經很成熟的jquery UI 庫和大量jquery 插件,幾乎是一個取之不盡用之不竭的寶庫。然而,它是 ...
  • 十、屬性優先順序 十一、註釋 11.1 <!-- ... --> 同HTML/XML的註釋 11.2 thymeleaf解析器註釋 thymeleaf解析的時候會被註釋,靜態打開時會顯示 單行 <!--/* ... */--> 多行時: <!--/*--> ... ... <!--/*--> 11.3 ...
  • 閱讀本文需要有React的基礎知識,可以在React 入門實例教程和React中文官網進行基礎學習。 沒有React基礎也可以學習本文,本文主要不是學習React,而是gulp+browserify進行模塊化開發。 1.創建項目和環境搭建 我們可以先創建一個文件夾叫react_item,作為項目的根 ...
  • 數據綁定這塊兒沒啥說的,簡單兩個例子帶過了。 Hello World: <!DOCTYPE html> <html ng-app> <head> <title>Simple app</title> <script src="https://ajax.googleapis.com/ajax/libs/ ...
  • 直接貼代碼先看 HTML: CSS: Javascript: 效果圖: PS: jQ和圖片路徑自己載入! ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...