【JavaScript】原型鏈 prototype 和 this 關鍵字的練習(老虎機)

這個老虎機練習主要考察JavaScript中的原型鏈(prototype)和this關鍵字的使用。


主要思路

  1. 創建三個輪盤(reels)實例:我們需要創建3個獨立的輪盤對象,它們都委托(delegate)到基礎的reel對象。這可以通過Object.create(reel)來實現,創建新對象并將其原型指向reel

  2. 實現display()方法:這是最復雜的部分,需要顯示3×3的網格:

    • 每個輪盤需要顯示三個位置:當前位置、上方位置和下方位置
    • 行顯示(水平方向):以"|"分隔的三個輪盤符號
    • 列顯示(垂直方向):每個輪盤的三個位置(上中下)

實現代碼

function randMax(max) {return Math.trunc(1E9 * Math.random()) % max;
}var reel = {symbols: ["?", "?", "?", "?", "?", "★", "?", "?"],spin() {if (this.position == null) {this.position = randMax(this.symbols.length); }this.position = (this.position + 100 + randMax(100)) % this.symbols.length;},display() {if (this.position == null) {this.position = randMax(this.symbols.length);}return this.symbols[this.position];}
};var slotMachine = {reels: [Object.create(reel),Object.create(reel),Object.create(reel)],spin() {this.reels.forEach(reel => {reel.spin();});},display() {// 獲取每個輪盤上方、當前和下方的符號var lines = [];// 創建三行(上、中、下)for (let linePos = -1; linePos <= 1; linePos++) {let line = this.reels.map(reel => {// 創建一個臨時對象,委托到reel,但擁有自己的positionvar slot = Object.create(reel);// 調整position以顯示上方/當前/下方的符號slot.position = ((reel.position + linePos) + reel.symbols.length) % reel.symbols.length;return slot.display();});lines.push(line.join(" | "));}// 打印結果console.log(lines.join("\n"));}
};slotMachine.spin();
slotMachine.display();slotMachine.spin();
slotMachine.display();

代碼解析

  • 循環創建三行:使用-101作為偏移量,分別表示上、中、下行

  • 顯示每個位置的符號

    • 為每個位置創建一個臨時對象(使用Object.create(reel)
    • 調整臨時對象的position屬性,考慮到循環(使用模運算)
    • 調用臨時對象的display()方法獲取符號
  • 處理循環邊界問題:當計算上方位置(特別是當前位置為0時),需要加上reel.symbols.length來確保結果為正,然后再取模

  • 格式化輸出:組合所有符號,map生成的行數組用"|“分隔轉換成字符串后加入lines數組,lines數組用換行符”\n"分隔轉換成字符串。

  • spin()方法有兩個主要作用:

    1. 初始化位置:如果輪盤的position屬性為null(比如第一次使用時),它會為輪盤設置一個初始隨機位置。

    2. 改變輪盤位置:每次調用spin()都會使輪盤旋轉一定數量的位置(至少100個位置加上0-99的隨機數),然后通過取模確保最終位置在有效范圍內。

      在示例代碼中:

      slotMachine.spin();
      slotMachine.display();
      // 顯示第一組結果slotMachine.spin();
      slotMachine.display();
      // 顯示第二組結果
      

      兩次結果不同,正是因為中間調用了spin()方法,改變了每個輪盤的位置。如果刪除第二個spin()調用,兩次display()會顯示完全相同的結果。

      所以spin()方法是整個老虎機機制的核心部分之一,它模擬了真實老虎機拉桿后輪盤旋轉的過程,而這個旋轉直接決定了最終顯示的符號組合。

  • reel原型對象

    1. reels數組中的對象

      reels: [Object.create(reel),Object.create(reel),Object.create(reel)
      ]
      

      這里創建了三個獨立的對象,每個都作為slotMachine的一個輪盤。這些對象在整個slotMachine的生命周期中持續存在,并且每個都維護自己的position屬性狀態。當我們調用slotMachine.spin()時,這三個對象的position屬性會被更新。

    2. display()方法中的臨時對象

      var slot = Object.create(reel); // 這個是個臨時對象,不是reels中的元素
      

      這是在display()方法內部創建的臨時對象,它在每次顯示時創建,用完即丟棄。這個臨時對象不是用來替代輪盤的,而是用來臨時保存修改后的位置,以便顯示上方或下方的符號,而不影響原始輪盤的position屬性

      理解這一點很關鍵:slot是通過原型鏈委托到reel對象的,而reels數組中的每個元素是通過原型鏈委托到同一個reel對象的獨立對象。

      因此,它們在內存中是完全不同的對象,只是共享相同的原型。這種結構讓我們能夠在不改變原始輪盤位置的情況下,顯示每個輪盤的上方、當前和下方位置的符號。

  • 理解參數reel的來源:

    1. this.reels.map(function getSlot(reel){...}) 中的reel參數是map方法傳入的,它代表的是this.reels數組中的每個元素,也就是我們在slotMachine初始化時創建的那三個輪盤對象。

    2. 然后,我們基于這個輪盤對象創建一個臨時對象:var slot = Object.create(reel),這個臨時對象的原型是當前遍歷到的輪盤對象,而不是原始的reel對象。

    3. 這樣,我們可以通過reel.position訪問到當前輪盤的位置,并在臨時對象中設置調整后的位置:slot.position = ...

    簡單來說,這里存在三層委托關系:

    • slot對象委托到reels數組中的特定輪盤對象
    • 那個輪盤對象又委托到原始的reel對象
    • 當我們調用slot.display()時,會使用slot自己的position,但方法本身是從reel原型繼承的

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/74549.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/74549.shtml
英文地址,請注明出處:http://en.pswp.cn/web/74549.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

vue項目data functions should return an object

在vue項目中提示錯誤&#xff0c;data functions should return an object Message.error(err)錯了&#xff0c;Message.error()是element-ui的組件&#xff0c;只能接受字符串&#xff0c;不能接受對象。 改為Message.error(err.message)就好了 我的錯誤是 Message.error(er…

leetcode刷題 - 數組理論基礎

數組是內存空間連續存儲、相同類型數據的集合。遍歷方式&#xff1a;下標索引 下標&#xff1a;從 0 開始 數組的元素不能刪除&#xff0c;只能覆蓋 定義一維數組&#xff1a; int arr0[10]; int arr1[10] { 100, 90,80,70,60,50,40,30,20,10 }; int arr2[ ] { 100,90,80,7…

狀態機思想編程練習

狀態機實現LED流水燈 本次實驗&#xff0c;我們將利用狀態機的思想來進行Verilog編程實現一個LED流水燈&#xff0c;并通過Modelsim來進行模擬仿真&#xff0c;再到DE2-115開發板上進行驗證。 ? 首先進行主要代碼的編寫。 module led (input sys_clk,input sys_…

數據結構|排序算法(一)快速排序

一、排序概念 排序是數據結構中的一個重要概念&#xff0c;它是指將一組數據元素按照特定的順序進行排列的過程&#xff0c;默認是從小到大排序。 常見的八大排序算法&#xff1a; 插入排序、希爾排序、冒泡排序、快速排序、選擇排序、堆排序、歸并排序、基數排序 二、快速…

如何確保MQ消息隊列不丟失:Java實現與流程分析

前言 在分布式系統中&#xff0c;消息隊列&#xff08;Message Queue, MQ&#xff09;是核心組件之一&#xff0c;用于解耦系統、異步處理和削峰填谷。然而&#xff0c;消息的可靠性傳遞是使用MQ時需要重點考慮的問題。如果消息在傳輸過程中丟失&#xff0c;可能會導致數據不一…

關于termux運行pc交叉編譯的aarch64 elf的問題

在Linux系統上交叉編譯Nim程序到Android Termux環境需要特殊處理&#xff0c;以下是詳細的解決方案&#xff1a; 問題根源分析 ??ABI不兼容?? Android使用bionic libc而非標準glibc&#xff0c;直接編譯的Linux ARM二進制無法直接運行 ??動態鏈接錯誤?? 默認編譯會鏈…

為PXIe控制器配置NI Linux實時操作系統安裝軟件

一、升級BIOS 使用NI Linux Real-Time操作系統的PXI硬件支持頁面來確定NI Linux Real-Time是否支持您的PXIe控制器&#xff0c;以及是否需要更新控制器BIOS。 按照BIOS下載頁面上的“安裝說明”部分安裝BIOS更新。 注意&#xff1a;NI在NI 2020軟件版本中刪除對cRIO的Phar Lap和…

《汽車噪聲控制》課程作業

作業內容 在MATLAB繪制給出單個正弦波或余弦波的時域圖和頻域圖 繪制實測數據的時域圖和頻域圖 圖1 單個正弦波的時頻圖 圖1 單個正弦波的時頻圖 % 正弦波參數設置 f0 1000; % 信號頻率 1kHz Fs 16384; % 采樣頻率 16kHz T 0.05; % 信號持續時間 0.05秒 A 0.8; % 信號幅度…

Baklib內容中臺AI技術協同應用

內容中臺與AI協同創新 在數字化轉型進程中&#xff0c;內容中臺通過人工智能技術的深度整合&#xff0c;正重塑企業信息管理范式。以Baklib內容中臺為例&#xff0c;其通過智能語義分析引擎解析用戶意圖&#xff0c;結合知識圖譜構建技術動態關聯碎片化信息&#xff0c;實現從…

壓測工具開發實戰篇(二)——構建側邊欄以及設置圖標字體

你好&#xff0c;我是安然無虞。 文章目錄 構建側邊欄QtAwesome使用調整側邊欄寬度了解: sizePolicy屬性偽狀態 在閱讀本文之前, 有需要的老鐵可以先回顧一下上篇文章: 壓測工具開發(一)——使用Qt Designer構建簡單界面 構建側邊欄 我們要實現類似于下面這樣的側邊欄功能: …

Axure RP9.0教程: 查詢條件隱藏與顯示(綜合了動態面板狀態切換及展開收縮效果實現)

文章目錄 引言I 原型顯示/隱藏搜索框思路步驟詳細操作II 若依 ruoyi 顯示/隱藏搜索框 & 顯示隱藏列自定義設置顯示隱藏列顯示/隱藏搜索框引言 數據篩選有大量的查詢條件時,可以選擇查詢隱藏效果。 I 原型顯示/隱藏搜索框 綜合了動態面板狀態切換及展開收縮效果實現 思…

解鎖工業通信:Profibus DP到ModbusTCP網關指南!

解鎖工業通信&#xff1a;Profibus DP到ModbusTCP網關指南&#xff01; 在工業自動化領域&#xff0c;隨著技術的不斷進步和應用場景的日益復雜&#xff0c;不同設備和系統之間的通訊協議兼容性問題成為了工程師們面臨的一大挑戰。尤其是在Profibus DP和Modbus/TCP這兩種廣泛應…

3維格式轉換(二)

基于python的三維模型演化可視化 本項目的主要內容為總結了3種不同的可視化方案( trimesh + matplotlib 庫、 pyvista 庫、 vedo 庫),并通過案例對可視化效果進行展示,最終通過模型動態演化案例給出最佳效果的可視化方案 本期結構圖為 本期博客結構圖 0 環境搭建 項目開…

docker導出image再導入到其它docker中

導出image docker save -o gxc_tenant.tar vue_tenant:1.0 eitc_tenant:1.0 redis:latest docker.io/mysql:8.0 minio/minio導入image docker load -i gxc_tenant.tar

Spring-IOC部分

Spring-IOC部分 1.SpringBean的配置詳解&#xff08;Bean標簽&#xff09; &#xff08;1&#xff09;scope 默認情況下&#xff0c;單純的Spring環境Bean的作用范圍有兩個&#xff1a;Singleton和Prototype singleton&#xff1a;單例&#xff0c;默認值&#xff0c;Spring…

人工智能爬蟲導致維基共享資源帶寬需求激增 50%

2025 年 4 月 1 日&#xff0c;維基媒體基金會在博文中表示&#xff0c;自 2024 年 1 月以來&#xff0c;維基共享資源下載多媒體的帶寬消耗激增 50%&#xff0c;這一變化趨勢主要由用于 AI 訓練數據集的網絡爬蟲導致。以下是具體分析1&#xff1a; 爬蟲流量特征與數據存儲模式…

2007-2019年各省地方財政交通運輸支出數據

2007-2019年各省地方財政交通運輸支出數據 1、時間&#xff1a;2007-2019年 2、來源&#xff1a;國家統計局、統計年鑒 3、指標&#xff1a;行政區劃代碼、地區、年份、地方財政交通運輸支出 4、范圍&#xff1a;31省 5、指標說明&#xff1a;地方財政交通運輸支出是指地方…

【爬蟲開發】爬蟲開發從0到1全知識教程第14篇:scrapy爬蟲框架,介紹【附代碼文檔】

本教程的知識點為&#xff1a;爬蟲概要 爬蟲基礎 爬蟲概述 知識點&#xff1a; 1. 爬蟲的概念 requests模塊 requests模塊 知識點&#xff1a; 1. requests模塊介紹 1.1 requests模塊的作用&#xff1a; 數據提取概要 數據提取概述 知識點 1. 響應內容的分類 知識點&#xff1a…

【CMake】《CMake構建實戰:項目開發卷》筆記-Chapter8-生成器表達式

第8章 生成器表達式 生成器表達式&#xff08;generator expression&#xff09;是由CMake生成器進行解析的表達式&#xff0c;因此&#xff0c;這些表達式只有在CMake的生成階段才被解析為具體的值。 CMake在生成階段&#xff0c;能夠根據具體選用的構建系統生成器生成特定…

Docker安裝、配置Mysql5.7

1.創建必要的目錄 # 創建目錄 mkdir -p ~/docker/software/mysql/{conf,log,data} 2.如果沒有docker-compose.yml文件的話&#xff0c;先創建docker-compose.yml 配置文件一般長這個樣子 version: 3services:mysql:image: mysql:5.7.36container_name: mysqlports:- "…