Submit Search
Upload
9. meta-programming
•
Download as PPTX, PDF
•
0 likes
•
365 views
Justin Lin
Follow
探索物件特性 判斷物件型態 認識Reflect API 結合Proxy與Reflect API
Read less
Read more
Technology
Report
Share
Report
Share
1 of 58
Download now
Recommended
script標籤基本特性 認識async與defer 初探同源策略與CORS 認識ES6前的模組管理 使用ECMAScript模組
10. 進入瀏覽器
10. 進入瀏覽器
Justin Lin
認識DOM操作 處理事件 掌握樣式 建立程式庫封裝細節
11. DOM、事件與樣式
11. DOM、事件與樣式
Justin Lin
深入模組管理 初識物件導向 學習定義類別 定義運算子
從模組到類別
從模組到類別
Justin Lin
使用REPL 認識內建型態 使用 let、const、var 宣告變數 掌握型態轉換
2. 型態、變數與運算子
2. 型態、變數與運算子
Justin Lin
認識建構式之作用 理解原型鏈機制 區別原型與類別典範 善用類別語法
5. 建構式、原型與類別
5. 建構式、原型與類別
Justin Lin
區別同步與非同步 運用Promise API 善用async、await 認識for-await-of 使用非同步產生器函式
6. 非同步設計
6. 非同步設計
Justin Lin
掌握this參考 運用物件實字 認識物件協定 使用符號協定
4. 使用物件
4. 使用物件
Justin Lin
認識Thread與Runnable 使用synchronized 使用wait()、notify()、notifyAll() 運用高階並行API
Java SE 8 技術手冊第 11 章 - 執行緒與並行API
Java SE 8 技術手冊第 11 章 - 執行緒與並行API
Justin Lin
Recommended
script標籤基本特性 認識async與defer 初探同源策略與CORS 認識ES6前的模組管理 使用ECMAScript模組
10. 進入瀏覽器
10. 進入瀏覽器
Justin Lin
認識DOM操作 處理事件 掌握樣式 建立程式庫封裝細節
11. DOM、事件與樣式
11. DOM、事件與樣式
Justin Lin
深入模組管理 初識物件導向 學習定義類別 定義運算子
從模組到類別
從模組到類別
Justin Lin
使用REPL 認識內建型態 使用 let、const、var 宣告變數 掌握型態轉換
2. 型態、變數與運算子
2. 型態、變數與運算子
Justin Lin
認識建構式之作用 理解原型鏈機制 區別原型與類別典範 善用類別語法
5. 建構式、原型與類別
5. 建構式、原型與類別
Justin Lin
區別同步與非同步 運用Promise API 善用async、await 認識for-await-of 使用非同步產生器函式
6. 非同步設計
6. 非同步設計
Justin Lin
掌握this參考 運用物件實字 認識物件協定 使用符號協定
4. 使用物件
4. 使用物件
Justin Lin
認識Thread與Runnable 使用synchronized 使用wait()、notify()、notifyAll() 運用高階並行API
Java SE 8 技術手冊第 11 章 - 執行緒與並行API
Java SE 8 技術手冊第 11 章 - 執行緒與並行API
Justin Lin
使用 pickle 與 shelve 認識 DB-API 2.0 使用 sqlite3 模組 處理 CSV、JSON、XML
10. 資料永續與交換
10. 資料永續與交換
Justin Lin
認識並行、平行與非同步 使用 threading 模組 使用 multiprocessing 模組 使用 concurrent.futures模組 運用 async、await 與 asyncio
並行、平行與非同步
並行、平行與非同步
Justin Lin
《Python 3.5 技術手冊》第 13 章投影片
並行與平行
並行與平行
Justin Lin
瞭解封裝觀念與實現 定義類別、建構式與方法 使用方法重載與不定長度引數 瞭解static成員
Java SE 8 技術手冊第 5 章 - 物件封裝
Java SE 8 技術手冊第 5 章 - 物件封裝
Justin Lin
這個投影片是搭配《Java Tutorial》課程,你可以在 CodeData 上看到所有內容,也可以直接在 Google Play 或 Pubu 上搜尋 "Java Tutorial" 以購得電子書。
Java Tutorial:Learn Java in 06:00:00
Java Tutorial:Learn Java in 06:00:00
Justin Lin
進階自訂泛型 進階自訂列舉 使用標準標註 自訂與讀取標註
自訂泛型、列舉與標註
自訂泛型、列舉與標註
Justin Lin
認識Thread與Runnable 使用synchronized 使用wait()、notify()、notifyAll() 運用高階並行API
CH11:執行緒與並行API
CH11:執行緒與並行API
Justin Lin
Java SE 7 技術手冊
Java SE 7 技術手冊投影片第 16 章 - 自訂泛型、列舉與標註
Java SE 7 技術手冊投影片第 16 章 - 自訂泛型、列舉與標註
Justin Lin
進階自訂泛型 進階自訂列舉 使用標準標註 自訂與讀取標註
Java SE 8 技術手冊第 18 章 - 自訂泛型、列舉與標註
Java SE 8 技術手冊第 18 章 - 自訂泛型、列舉與標註
Justin Lin
瞭解串流與輸入輸出 認識InputStream、OutputStream繼承架構 認識Reader、Writer繼承架構 使用輸入輸出裝飾器
CH10:輸入輸出
CH10:輸入輸出
Justin Lin
開發環境準備與使用 • 了解Web應用程式架構 • Servlet撰寫與部署設定 • 了解URI模式對應 • 使用web-fragement.xml
Ch02 撰寫與設定Servlet
Ch02 撰寫與設定Servlet
Justin Lin
《Python 3.5 技術手冊》第 10 章投影片
資料永續與交換
資料永續與交換
Justin Lin
《Python 3.5 技術手冊》第 4 章投影片
流程語法與函式
流程語法與函式
Justin Lin
Java SE 7 技術手冊
Java SE 7 技術手冊投影片第 05 章 - 物件封裝
Java SE 7 技術手冊投影片第 05 章 - 物件封裝
Justin Lin
使用 Tag File 自訂標籤 使用 Simple Tag 自訂標籤 使用 Tag 自訂標籤
Ch08 自訂標籤
Ch08 自訂標籤
Justin Lin
區別程式庫與框架 逐步善用 Spring MVC 簡介 Thymeleaf 模版 使用 Spring Security
Ch13 整合 Spring MVC/Security
Ch13 整合 Spring MVC/Security
Justin Lin
Java SE 7 技術手冊
Java SE 7 技術手冊投影片第 07 章 - 介面與多型
Java SE 7 技術手冊投影片第 07 章 - 介面與多型
Justin Lin
Java SE 7 技術手冊
Java SE 7 技術手冊投影片第 11 章 - 執行緒與並行API
Java SE 7 技術手冊投影片第 11 章 - 執行緒與並行API
Justin Lin
認識模組的種類 處理模組依賴與封裝細節 使用模組API 建立JAR、JMOD與JIMAGE
CH19:深入模組化
CH19:深入模組化
Justin Lin
了解JDBC架構 使用JDBC API 瞭解交易與隔離層級 認識RowSet
CH16:整合資料庫
CH16:整合資料庫
Justin Lin
ASP.NET MVC with Repository Pattern
Introduction the Repository Pattern
Introduction the Repository Pattern
Bill Lin
Django讀書會
Chapter 4 models
Chapter 4 models
Ekman Hsieh
More Related Content
What's hot
使用 pickle 與 shelve 認識 DB-API 2.0 使用 sqlite3 模組 處理 CSV、JSON、XML
10. 資料永續與交換
10. 資料永續與交換
Justin Lin
認識並行、平行與非同步 使用 threading 模組 使用 multiprocessing 模組 使用 concurrent.futures模組 運用 async、await 與 asyncio
並行、平行與非同步
並行、平行與非同步
Justin Lin
《Python 3.5 技術手冊》第 13 章投影片
並行與平行
並行與平行
Justin Lin
瞭解封裝觀念與實現 定義類別、建構式與方法 使用方法重載與不定長度引數 瞭解static成員
Java SE 8 技術手冊第 5 章 - 物件封裝
Java SE 8 技術手冊第 5 章 - 物件封裝
Justin Lin
這個投影片是搭配《Java Tutorial》課程,你可以在 CodeData 上看到所有內容,也可以直接在 Google Play 或 Pubu 上搜尋 "Java Tutorial" 以購得電子書。
Java Tutorial:Learn Java in 06:00:00
Java Tutorial:Learn Java in 06:00:00
Justin Lin
進階自訂泛型 進階自訂列舉 使用標準標註 自訂與讀取標註
自訂泛型、列舉與標註
自訂泛型、列舉與標註
Justin Lin
認識Thread與Runnable 使用synchronized 使用wait()、notify()、notifyAll() 運用高階並行API
CH11:執行緒與並行API
CH11:執行緒與並行API
Justin Lin
Java SE 7 技術手冊
Java SE 7 技術手冊投影片第 16 章 - 自訂泛型、列舉與標註
Java SE 7 技術手冊投影片第 16 章 - 自訂泛型、列舉與標註
Justin Lin
進階自訂泛型 進階自訂列舉 使用標準標註 自訂與讀取標註
Java SE 8 技術手冊第 18 章 - 自訂泛型、列舉與標註
Java SE 8 技術手冊第 18 章 - 自訂泛型、列舉與標註
Justin Lin
瞭解串流與輸入輸出 認識InputStream、OutputStream繼承架構 認識Reader、Writer繼承架構 使用輸入輸出裝飾器
CH10:輸入輸出
CH10:輸入輸出
Justin Lin
開發環境準備與使用 • 了解Web應用程式架構 • Servlet撰寫與部署設定 • 了解URI模式對應 • 使用web-fragement.xml
Ch02 撰寫與設定Servlet
Ch02 撰寫與設定Servlet
Justin Lin
《Python 3.5 技術手冊》第 10 章投影片
資料永續與交換
資料永續與交換
Justin Lin
《Python 3.5 技術手冊》第 4 章投影片
流程語法與函式
流程語法與函式
Justin Lin
Java SE 7 技術手冊
Java SE 7 技術手冊投影片第 05 章 - 物件封裝
Java SE 7 技術手冊投影片第 05 章 - 物件封裝
Justin Lin
使用 Tag File 自訂標籤 使用 Simple Tag 自訂標籤 使用 Tag 自訂標籤
Ch08 自訂標籤
Ch08 自訂標籤
Justin Lin
區別程式庫與框架 逐步善用 Spring MVC 簡介 Thymeleaf 模版 使用 Spring Security
Ch13 整合 Spring MVC/Security
Ch13 整合 Spring MVC/Security
Justin Lin
Java SE 7 技術手冊
Java SE 7 技術手冊投影片第 07 章 - 介面與多型
Java SE 7 技術手冊投影片第 07 章 - 介面與多型
Justin Lin
Java SE 7 技術手冊
Java SE 7 技術手冊投影片第 11 章 - 執行緒與並行API
Java SE 7 技術手冊投影片第 11 章 - 執行緒與並行API
Justin Lin
認識模組的種類 處理模組依賴與封裝細節 使用模組API 建立JAR、JMOD與JIMAGE
CH19:深入模組化
CH19:深入模組化
Justin Lin
了解JDBC架構 使用JDBC API 瞭解交易與隔離層級 認識RowSet
CH16:整合資料庫
CH16:整合資料庫
Justin Lin
What's hot
(20)
10. 資料永續與交換
10. 資料永續與交換
並行、平行與非同步
並行、平行與非同步
並行與平行
並行與平行
Java SE 8 技術手冊第 5 章 - 物件封裝
Java SE 8 技術手冊第 5 章 - 物件封裝
Java Tutorial:Learn Java in 06:00:00
Java Tutorial:Learn Java in 06:00:00
自訂泛型、列舉與標註
自訂泛型、列舉與標註
CH11:執行緒與並行API
CH11:執行緒與並行API
Java SE 7 技術手冊投影片第 16 章 - 自訂泛型、列舉與標註
Java SE 7 技術手冊投影片第 16 章 - 自訂泛型、列舉與標註
Java SE 8 技術手冊第 18 章 - 自訂泛型、列舉與標註
Java SE 8 技術手冊第 18 章 - 自訂泛型、列舉與標註
CH10:輸入輸出
CH10:輸入輸出
Ch02 撰寫與設定Servlet
Ch02 撰寫與設定Servlet
資料永續與交換
資料永續與交換
流程語法與函式
流程語法與函式
Java SE 7 技術手冊投影片第 05 章 - 物件封裝
Java SE 7 技術手冊投影片第 05 章 - 物件封裝
Ch08 自訂標籤
Ch08 自訂標籤
Ch13 整合 Spring MVC/Security
Ch13 整合 Spring MVC/Security
Java SE 7 技術手冊投影片第 07 章 - 介面與多型
Java SE 7 技術手冊投影片第 07 章 - 介面與多型
Java SE 7 技術手冊投影片第 11 章 - 執行緒與並行API
Java SE 7 技術手冊投影片第 11 章 - 執行緒與並行API
CH19:深入模組化
CH19:深入模組化
CH16:整合資料庫
CH16:整合資料庫
Similar to 9. meta-programming
ASP.NET MVC with Repository Pattern
Introduction the Repository Pattern
Introduction the Repository Pattern
Bill Lin
Django讀書會
Chapter 4 models
Chapter 4 models
Ekman Hsieh
Hibernate教程
Hibernate教程
Hibernate教程
Shilong Sang
kotlin-big-nerd-ranch ch4 function
kotlin-big-nerd-ranch ch4 function
kotlin-big-nerd-ranch ch4 function
MinHan Hong
讲述javascript面向对象编程的一些要点
Javascript进阶编程
Javascript进阶编程
iflytek
Video: https://www.youtube.com/watch?v=M_DUmyRIkQ8&list=PLTUHmtFhYC6iEwu4h2REYhNKCHFFHYngS&index=13
A brief introduction to Machine Learning
A brief introduction to Machine Learning
Wen-Tien Chang
code guidelines for C#
Code guidelines
Code guidelines
Jeffray Huang
信息系统开发平台OpenExpressApp
信息系统开发平台OpenExpressApp
zhoujg
講者Luba Tang是來自聯發科的軟體架構師。在此次的AU Talk,他與聽眾們分享他軟體的開發經驗,以實務的角度出發,告訴我們要如何有效率、有次序地開發一個軟體。 軟體是集眾人的智慧,一起做出有用的東西,成就有用的人。軟體的生產要素是人。人是有情緒的,不完美的,有缺陷的。如何集眾人之力,讓事情發生,可以說是開發軟體時真正的挑戰。
2012/05/23 AU Talk - 讓事情發生
2012/05/23 AU Talk - 讓事情發生
appuniverz
運用MMLSpark 來加速Spark 上機器學習專案
運用MMLSpark 來加速Spark 上機器學習專案
運用MMLSpark 來加速Spark 上機器學習專案
Herman Wu
使用 Akka.NET 與 .NET Core 建立響應式應用程式
Reactive application with akka.NET & .NET Core
Reactive application with akka.NET & .NET Core
Chen-Tien Tsai
全文搜尋引擎的進階實作與應用
全文搜尋引擎的進階實作與應用
建興 王
开源应用日志收集系统
开源应用日志收集系统
开源应用日志收集系统
klandor
spark tutorial
Spark tutorial
Spark tutorial
Lin JiaMing
在 2015 年 7 月至新北市樹林國小舉辦 Laravel 工作坊,讓參與的學員在 30 個小時內學會使用 Laravel 建置一個具 Open ID 認證功能的網路應用程式。
Model 設定與 Seeding
Model 設定與 Seeding
Shengyou Fan
美团前端架构简介
美团前端架构简介
pan weizeng
在 2015 年 5 月,我們與臺中科大資工系合作,舉辦 Laravel 工作坊,讓參與的學員在 20 個小時內學會使用 Laravel 建置一個簡易的 Blog 系統。
Model 設定與 Seeding
Model 設定與 Seeding
Shengyou Fan
Django敏捷开发 刘天斯
Django敏捷开发 刘天斯
liuts
高级PHP应用程序漏洞审核技术
高级PHP应用程序漏洞审核技术
wensheng wei
a slide for psotgresql
Postgre sql intro 0
Postgre sql intro 0
March Liu
Similar to 9. meta-programming
(20)
Introduction the Repository Pattern
Introduction the Repository Pattern
Chapter 4 models
Chapter 4 models
Hibernate教程
Hibernate教程
kotlin-big-nerd-ranch ch4 function
kotlin-big-nerd-ranch ch4 function
Javascript进阶编程
Javascript进阶编程
A brief introduction to Machine Learning
A brief introduction to Machine Learning
Code guidelines
Code guidelines
信息系统开发平台OpenExpressApp
信息系统开发平台OpenExpressApp
2012/05/23 AU Talk - 讓事情發生
2012/05/23 AU Talk - 讓事情發生
運用MMLSpark 來加速Spark 上機器學習專案
運用MMLSpark 來加速Spark 上機器學習專案
Reactive application with akka.NET & .NET Core
Reactive application with akka.NET & .NET Core
全文搜尋引擎的進階實作與應用
全文搜尋引擎的進階實作與應用
开源应用日志收集系统
开源应用日志收集系统
Spark tutorial
Spark tutorial
Model 設定與 Seeding
Model 設定與 Seeding
美团前端架构简介
美团前端架构简介
Model 設定與 Seeding
Model 設定與 Seeding
Django敏捷开发 刘天斯
Django敏捷开发 刘天斯
高级PHP应用程序漏洞审核技术
高级PHP应用程序漏洞审核技术
Postgre sql intro 0
Postgre sql intro 0
More from Justin Lin
認識 Spring Boot 認識 Spring Tool Suite 遷移微網誌至 Spring Boot
Ch14 簡介 Spring Boot
Ch14 簡介 Spring Boot
Justin Lin
使用 Gradle 結合 Gradle 與 IDE 認識相依注入 使用 Spring 核心
Ch12 Spring 起步走
Ch12 Spring 起步走
Justin Lin
寄送純文字郵件 寄送 HTML 郵件 寄送附檔郵件
Ch11 簡介 JavaMail
Ch11 簡介 JavaMail
Justin Lin
了解 Java EE 安全概念與名詞 使用容器基本驗證與表單驗 使用 HTTPS 保密資料傳輸
Ch10 Web 容器安全管理
Ch10 Web 容器安全管理
Justin Lin
了解 JDBC 架構 使用基本的 JDBC 透過 JNDI 取得DataSource 在 Web 應用程式整合資料庫
Ch09 整合資料庫
Ch09 整合資料庫
Justin Lin
了解何謂 JSTL 使用 JSTL 核心標籤庫 使用 JSTL 格式標籤庫 使用 JSTL XML 標籤庫 使用 JSTL 函式標籤庫
Ch07 使用 JSTL
Ch07 使用 JSTL
Justin Lin
了解 JSP 生命週期 使用 JSP 語法元素 使用 JSP 標準標籤 使用運算式語言(EL) 自訂 EL 函式
Ch06 使用 JSP
Ch06 使用 JSP
Justin Lin
了解 Servlet 生命週期 使用 ServletConfig 與ServletContext 使用 PushBuilder 各種傾聽器的使用 繼承 HttpFilter 實作過濾器
Ch05 Servlet 進階 API、過濾器與傾聽器
Ch05 Servlet 進階 API、過濾器與傾聽器
Justin Lin
了解會話管理基本原理 使用 Cookie 類別 使用 HttpSession 會話管理 了解容器會話管理原理
Ch04 會話管理
Ch04 會話管理
Justin Lin
取得請求參數與標頭 處理中文字元請求與回應 設定與取得請求範圍屬性 使用轉發、包含、重新導向
Ch03 請求與回應
Ch03 請求與回應
Justin Lin
開發環境準備與使用 了解 Web 應用程式架構 Servlet 撰寫與部署設定 了解 URI 模式對應 使用 web-fragement.xml
Ch02 撰寫與設定 Servlet
Ch02 撰寫與設定 Servlet
Justin Lin
認識 HTTP 基本特性 了解何為 URI 編碼 認識 Web 容器角色 了解 Servlet 與 JSP 的關係 認識 MVC/Model 2
CH1. 簡介 Web 應用程式
CH1. 簡介 Web 應用程式
Justin Lin
運用描述器 實作裝飾器 定義 meta 類別 使用相對匯入 泛型進階
14. 進階主題
14. 進階主題
Justin Lin
認識並行、平行與非同步 使用 threading 模組 使用 multiprocessing 模組 使用 concurrent.futures模組 運用 async、await 與 asyncio
13.並行、平行與非同步
13.並行、平行與非同步
Justin Lin
使用 pdb 模組除錯 對程式進行單元測試 使用 timeit 評測程式片段 使用 cProfile(profile)察看評測數據
12. 除錯、測試與效能
12. 除錯、測試與效能
Justin Lin
處理日期與時間 認識日誌的使用 運用規則表示式 管理檔案與目錄 URL 處理
11. 常用內建模組
11. 常用內建模組
Justin Lin
認識 hashable、iterable、orderable 對物件進行排序 認識群集架構 運用 collections 模組 運用 collections.abc 模組
9. 資料結構
9. 資料結構
Justin Lin
使用 open()函式 使用 stdin、stdout、stderr 認識檔案描述器 認識 io 模組
8. open() 與 io 模組
8. open() 與 io 模組
Justin Lin
使用 try、except 處理例外 認識例外繼承架構 認識 raise 使用時機 運用 finally 清除資源 使用 with as 管理資源
7. 例外處理
7. 例外處理
Justin Lin
瞭解繼承目的 認識鴨子定型 重新定義方法 認識 object 建立、尋找文件資源 泛型入門
6. 類別的繼承
6. 類別的繼承
Justin Lin
More from Justin Lin
(20)
Ch14 簡介 Spring Boot
Ch14 簡介 Spring Boot
Ch12 Spring 起步走
Ch12 Spring 起步走
Ch11 簡介 JavaMail
Ch11 簡介 JavaMail
Ch10 Web 容器安全管理
Ch10 Web 容器安全管理
Ch09 整合資料庫
Ch09 整合資料庫
Ch07 使用 JSTL
Ch07 使用 JSTL
Ch06 使用 JSP
Ch06 使用 JSP
Ch05 Servlet 進階 API、過濾器與傾聽器
Ch05 Servlet 進階 API、過濾器與傾聽器
Ch04 會話管理
Ch04 會話管理
Ch03 請求與回應
Ch03 請求與回應
Ch02 撰寫與設定 Servlet
Ch02 撰寫與設定 Servlet
CH1. 簡介 Web 應用程式
CH1. 簡介 Web 應用程式
14. 進階主題
14. 進階主題
13.並行、平行與非同步
13.並行、平行與非同步
12. 除錯、測試與效能
12. 除錯、測試與效能
11. 常用內建模組
11. 常用內建模組
9. 資料結構
9. 資料結構
8. open() 與 io 模組
8. open() 與 io 模組
7. 例外處理
7. 例外處理
6. 類別的繼承
6. 類別的繼承
9. meta-programming
1.
2.
9. meta-programming • 學習目標 –
探索物件特性 – 判斷物件型態 – 認識Reflect API – 結合Proxy與Reflect API 2
3.
• meta前置詞源於希臘文,原本相當於之後 (after)、超越(beyond)之意 • 後續衍生出許多意義,像是關於(about) –
metadata是「與資料相關的資料」(data about data) 3
4.
• meta-programming可以對比為「與程式 設計相關的程式設計」(programming about programming) •
不同於靜態的data,programming是動態 的,「meta-programming從事的程式設 計,會影響另一個程式設計」 4
5.
• 就JavaScript而言… • 檢視程式行為、修改程式行為,甚至是修 改語言預設行為等,可以令程式受到影響 的程式設計 5
6.
修補API 6
7.
• 要運用這種手法,必須是特性值不會被設 為Falsy family成員的情況 •
如果無法避免這類情況,必須做更嚴格的 檢查 7
8.
8
9.
特性/值清單 • for..in針對的是實例本身以及繼承而來 的可列舉(emnuerable)特性 • propertyIsEnumerable() 9
10.
• Object.keys() • Object.values() •
Object.entries() 10
11.
• Object.getOwnPropertyNames() • Object.getOwnPropertySymbols() 11
12.
特性順序 • EnumerateObjectProperties規範只從實 例本身以及原型鏈取得可列舉特性,for in就是實作之一 • 沒有規範順序排列問題,因此for
in列舉 的特性順序因不同引擎實作而有所差別 • Object.keys()的順序是依賴在實作品 12
13.
• [[OwnPropertyKeys]]規範如何取得自身 特性,也定義了順序 – 會先考慮數字索引,以數字遞增方式取得,接 著是特性被建立的順序,然後才是符號被建立 的順序 •
採用的函式有… – Object.getOwnPropertyNames() – Object.getOwnPropertySymbols() – Reflect.ownKeys() 13
14.
物件型態 • 對於基本型態、函式、undefined、 Function實例的話,許多場合會使用 typeof,對於其他的物件型態 • 如果想判斷物件是否屬於某個繼承關係, 常見使用instanceof •
在沒有進一步定義下,instanceof的判 斷依據是原型鏈 14
15.
• Symbol.hasInstance靜態方法傳回值決 定了使用instanceof判斷時,受測實例 是否被視為此類別型態 15
16.
constructor特性 • 不是個別實例擁有,而是建構式或類別 prototype上的特性 • 也常見作為型態檢測的依據 •
constructor可以修改 • 使用原型鏈實現繼承時,建議設定 constructor指向子建構式 • 使用類別語言定義子類別時,會自動設定 constructor特性 16
17.
Object.prototype.toString() • ECMAScript規範要求呼叫後,必須傳回 '[object class]'格式的字串 17
18.
• 基於對標準的支持,不少程式庫也會使用 這個來作為標準內建型態的判斷依據 • ES5以前,沒有方式可以調整'[object class]'格式中'class'的部份 •
Object.prototype.toString()實際 上是取得引擎內部實作[[Class]]的資訊 18
19.
• ES6在定義建構或類別時,可以定義 Symbol.toStringTag特性,決定 '[object class]'格式'class'的部份 19
20.
20
21.
真陣列? • Array.isArray()就是根據內部實作特 性[[Class]]的值'Array‘ • 在ES5剛釋出的那個年代,若想修補 Array.isArray()該怎麼做呢? 21
22.
• 真正的Array.isArray()看的是[[Class]] 22
23.
Symbol.species • 陣列的方法執行後若傳回陣列,使用類別 語法繼承Array的子型態,呼叫這類方法 後傳回的物件也會是子型態 • 指定子類別要使用哪個類別來建構實例 23
24.
24
25.
25
26.
物件相等性 • == • === •
SameValueZero • SameValue 26
27.
• Set元素、Map的鍵在比較相等性時,使用 SameValueZero演算 – 採用===,然而NaN等於NaN,0等於-0。 •
SameValue演算與SameValueZero演算不 同的地方只在於,0不等於-0, 27
28.
• 採用SameValue演算的API之一是 Object.is()函式 28
29.
• Object.defineProperty()、 Object.defineProperties() 29
30.
• 多數API基本上採用===就好了 • 如果真的不能避免NaN,或者必須區分0與- 0,就要留意SameValueZero與 SameValue的差別 30
31.
Reflect與Proxy • ECMAScript規範[[GetPrototypeOf]]、 [[SetPrototypeOf]]、[[IsExtensible]]等 • 在實現JavaScript引擎時,這類演算實現為 引擎的內部方法(Internal
method) • 在ES5時,可以存取內部方法的API,隨意 地配置為Object的函式 31
32.
• ES6以後,提供了Reflect API作為存取內 部方法的統一管道,並提供更多的控制細 節 •
ES6以後也新增Proxy API,提供了干涉內 部方法的時機點,可干涉的點與Reflect API一對一對應 • 透過Proxy與Reflect的各種結合,就可 為 meta-programming提供諸多的可能性 32
33.
Reflect API • Object被取代的函式 –
Reflect.getPrototypeOf() – Reflect.setPrototypeOf() – Reflect.isExtensible() – Reflect.preventExtensions() – Reflect.defineProperty() – Reflect.getOwnPropertyDescriptor() 33
34.
• 與Object上相對應的函式,功能上基本相 同 • 略作調整的地方 –
Object有些對應的函式執行完會傳回物件本 身,而Reflect會傳回布林值 – Object對應的函式target參數若是基本型態, 會使用對應的類別實例來包裹基本型態值,然 而,Reflect在此時會拋出TypeError 34
35.
• 在ES6以後,建議使用Reflect的這些方法, 來取代Object對應的方法 • 未來與內部方法存取相關的函式,只會在 Reflect上配置 35
36.
36
37.
進階函式控制 • func.apply(self, args)這類呼叫, 隱含地假設func實例本身沒有定義 apply()方法 •
若想不想發生同名問題,方式之一是使用 Function.prototype.apply.apply( func, [self, args]) 37
38.
• ES6以後,可以使用Reflect.apply()來 達到相同目的 • Reflect.apply(func,
self, args) 38
39.
• 定義取值函式或設值函式,如果想控制 this的對象呢? 39
40.
• ES6以後,可以使用Reflect.get()或 Reflect.set() 40
41.
• Reflect.get()或Reflect.set()存取 的是[[GET]]、[[SET]]內部方法 • 純綷用來當成是存取特性值也是可行的 41
42.
運算子的對應函式 • in、delete、new運算子使用到內部方法 • 對應函式Reflect.has()、 Reflect.deleteProperty()、 Reflect.construct() 42
43.
• 非嚴格模式下,對於不可組態的特性, delete刪除失敗會傳回false,若是嚴格 模式,刪除失敗會引發TypeError • Reflect.deleteProperty()
成功的 話會傳回true,刪除失敗會傳回false 43
44.
• 在建構物件時會使用new運算子, Reflect.construct()是對應的函式 44
45.
• 可以指定建構式中new.target的實際建 構式或類別 45
46.
• new.target代表建構式,建構式的 prototype,會成為實例的原型 46
47.
Proxy API • 希望能在存取物件特性時進行 console.log(),記錄有哪些特性被存取了? •
Proxy實例會捕捉(Trap)並呼叫處理器上 定義的對應方法 47
48.
48
49.
代理模式 • Reflect的函式,與Proxy處理器可設定 的捕捉方法是一對一對應的 • Proxy實例可捕捉內部方法被操作的時機, 在處理器中Reflect用來存取內部方法 49
50.
• 實作上提供代理物件給客戶端操作,代理 物件具有與目標物件相同介面 • 在客戶端對實作毫不知情下,不會意識到 正在操作的是代理物件 •
代理物件可以單純地將任務轉發給目標物 件,或者是在這前後附加額外的邏輯 50
51.
• 明顯地被違反物件既有的協定,試圖實作 代理會拋出TypeError 51
52.
52
53.
this又是誰? 53
54.
54
55.
55
56.
56
57.
57
58.
• 想要有個可撤消的(Revocable)的Proxy 實例,可使用Proxy.revocable()函式 58
Download now