重學前端學習筆記(八)--JavaScript中的原型和類

筆記說明

重學前端是程劭非(winter)【前手機淘寶前端負責人】在極客時間開的一個專欄,每天10分鐘,重構你的前端知識體系,筆者主要整理學習過程的一些要點筆記以及感悟,完整的可以加入winter的專欄學習【原文有winter的語音】,如有侵權請聯系我,郵箱:kaimo313@foxmail.com。

一、什么是原型?

1.0、定義

原型是指一個詞語或一個類型意義的所有典型模型或原形象,是一個類型的組典型特征

1.1、基于類的編程語言

諸如 C++、Java 等流行的編程語言是使用類的方式來描述對象,基于類的編程提倡使用一個關注分類和類之間關系開發模型。

1.2、基于原型的編程語言

如 JavaScript 編程語言是利用原型來描述對象,基于原型的編程看起來更為提倡程序員去關注一系列對象實例的行為,而后才去關心如何將這些對象,劃分到最近的使用方式相似的原型對象,而不是將它們分成類。

1.3、原型系統的“復制操作”有兩種實現思路

  • 一個是并不真的去復制一個原型對象,而是使得新對象持有一個原型的引用
  • 另一個是切實地復制對象,從此兩個對象再無關聯。

javaScript選擇了第一種方式。

二、JavaScript 的原型

2.0、原型系統的兩條概括

  • 如果所有對象都有私有字段 [[prototype]],就是對象的原型
  • 讀一個屬性,如果對象本身沒有,則會繼續訪問對象的原型,直到原型為空或者找到為止。

2.1、三個內置函數

可以利用下面三個方法,更直接地訪問操縱原型,來實現抽象和復用。

  • Object.create 根據指定的原型創建新對象,原型可以是 null
  • Object.getPrototypeOf 獲得一個對象的原型
  • Object.setPrototypeOf 設置一個對象的原型

winter舉了用原型來抽象貓和虎的例子:

var cat = {say() {console.log("meow~");},jump() {console.log("jump");}
}var tiger = Object.create(cat,  {say: {writable: true,configurable: true,enumerable: true,value: function(){console.log("roar!");}}
})var anotherCat = Object.create(cat);anotherCat.say(); // meow~var anotherTiger = Object.create(tiger);anotherTiger.say(); // roar!復制代碼

三、早期版本中的類與原型

3.0、“類”的定義是一個私有屬性 [[class]]

所有具有內置 class 屬性的對象:(ES3和之前版本)

var o = new Object;
var n = new Number;
var s = new String;
var b = new Boolean;
var d = new Date;
var arg = function(){ return arguments }();
var r = new RegExp;
var f = new Function;
var arr = new Array;
var e = new Error;
console.log([o, n, s, b, d, arg, r, f, arr, e].map(v =>   Object.prototype.toString.call(v))
)復制代碼

語言使用者唯一可以訪問 [[class]] 屬性的方式是 Object.prototype.toString

3.1、[[class]] 私有屬性被 Symbol.toStringTag 代替

可以查看MDN文檔Symbol.toStringTag以及Object.prototype.toString的介紹:(ES5開始)

var o = { [Symbol.toStringTag]: "MyObject" }
console.log(o + ""); // [object MyObject]
復制代碼

上面這段代碼創建了一個新對象,并且給它唯一的一個屬性 Symbol.toStringTag,用字符串加法觸發了Object.prototype.toString 的調用,發現這個屬性最終對 Object.prototype.toString 的結果產生了影響。

3.2、new運算做了什么?

  • 1、以構造器的 prototype 屬性(注意與私有字段 [[prototype]] 的區分)為原型,創建新對象
  • 2、將 this 和調用參數傳給構造器,執行
  • 3、如果構造器返回的是對象,則返回,否則返回第一步創建的對象。

用構造器模擬類的兩種方法:

// 1、在構造器中修改 this,給 this 添加屬性function c1() {this.p1 = 1;this.p2 = function(){console.log(this.p1);}
}
var o1 = new c1;
o1.p2(); // 1// 2、修改構造器的 prototype 屬性指向的對象,它是從這個構造器構造出來的所有對象的原型。function c2() {
}
c2.prototype.p1 = 1;
c2.prototype.p2 = function() {console.log(this.p1);
}var o2 = new c2;
o2.p2(); // 1復制代碼

四、ES6 中的類

4.0、類的基本寫法

class Rectangle {constructor(height, width) {this.height = height;this.width = width;}// Getterget area() {return this.calcArea();}// MethodcalcArea() {return this.height * this.width;}
}復制代碼

4.1、類的繼承能力

class Animal {constructor(name) {this.name = name;}speak() {console.log(this.name + ' makes a noise.');}
}class Dog extends Animal {constructor(name) {super(name); // call the super class constructor and pass in the name parameter}speak() {console.log(this.name + ' barks.');}
}let d = new Dog('Mitzie');
d.speak(); // Mitzie barks.復制代碼

上面代碼調用子類的 speak 方法獲取了父類的 name。如果對于class還想了解更多,可以查看MDN文檔Classes部分。

個人總結

其實對于這一部分很是不明白,也不清楚,對于這些js基礎性的東西還是要多下下功夫才行,畢竟winter的重學前端真心不錯,對我來說進行查漏補缺,看清自己的水平很有幫助,路還很長,還要加油呀!!!

轉載于:https://juejin.im/post/5cd02d63f265da03b36efc18

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

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

相關文章

代碼實現照片素描_我的代碼素描之旅

代碼實現照片素描In 2018 I started the process of consistently creating and posting my code sketches online. These are small animations I make with code and post on instagram. Through these sketches I tried to visually express my ideas using color, animatio…

GCC參數詳解

轉自:http://www.cnblogs.com/fence/archive/2009/12/18/1627138.html GCC參數詳解 gcc and g分別是gnu的c & c編譯器 gcc/g在執行編譯工作的時候,總共需要4步1.預處理,生成.i的文件[預處理器cpp]2.將預處理后的文件不轉換成匯編語言,生成文件.s[編…

真效率神器,UI稿智能轉換成前端代碼,準確率極高

大家好,我是若川。在這充滿網絡促銷活動的幾個月,倍感壓力的,除了你的口袋,是否還有程序員的發量呢?每年的雙十一、雙十二購物狂歡節,各大電商平臺都會上線讓消費者充滿購買欲望的活動頁面,而這…

PPT圖標的正確使用和插入與編輯形狀

PPT圖標的正確使用和插入與編輯形狀 通過圖標可以以符號的形式直觀地傳遞信息。 一,實戰:在銷售工作計劃中插入圖標 PowerPoint 2016中提供了多種類型的圖標,用戶可根據需要在幻燈片中插入所需的圖標。 二,實戰:更改銷…

幾個用于序列化的代碼片段

參考JavaScriptSerializer,一般用來做JSON格式化http://msdn.microsoft.com/zh-cn/library/system.web.script.serialization.javascriptserializer.aspx http://msdn.microsoft.com/zh-cn/library/system.web.script.serialization.javascriptconverter.aspxDataContractSeria…

桌面圖標擺放圖案_用圖標制作醒目的圖案

桌面圖標擺放圖案Level up your video calls with a custom backdrop created using Noun Project icons.使用使用Noun Project圖標創建的自定義背景來升級視頻通話。 The only thing more visually pleasing than a well-designed icon is a neat, eye-catching pattern made…

3個多月,近3000人參與的源碼共讀,誠邀加入~

大家好,我是若川。眾所周知,從8月份開始,我組織了源碼共讀活動,每周學習200行左右的源碼,到現在持續了3個多月,堅持答疑解惑。幫助了不少人,還是挺開心的。另外,涌現了很多優秀的讀者…

upc 組隊賽18 STRENGTH【貪心模擬】

STRENGTH 題目鏈接 題目描述 Strength gives you the confidence within yourself to overcome any fears, challenges or doubts. Feel the fear and do it anyway! If you have been going through a rough time and feel burnt out or stressed, the Strength card encourag…

JSONNull

最近用JSONObject,感覺比xml好用一些,json的打包和解包都比較清晰和容易,最近遇到一個問題,將一個JSON對象解析,存到hashmap中去,然后再從hashmap取出數據,遇到jsonnull的問題,本以為…

“這張圖告訴你什么?”

For data to be impactful, it must be understood.為了使數據具有影響力,必須理解它。 I’ve happily spent hundreds and hundreds of hours of my life watching users misunderstand data visualizations. I’m strangely hooked on it.我快樂地度過了數百個小…

我們從 UmiJS 遷移到了 Vite

大家好,我是若川。最近組織了源碼共讀活動,感興趣的可以點此加我微信ruochuan12 進群參與,每周大家一起學習200行左右的源碼,共同進步。已進行三個月了,很多小伙伴表示收獲頗豐。我們從 UmiJS遷移到 Vite 已經上線半年…

將DataTable的內容以EXCEl的形式導出到本地

1.在搞項目的時候一般會遇到,將GridView或者Repeater的內容以Excel的形式保存到本地,即導出功能。我總結了兩個方法。 方法一: 1 DataTable dt query.GetItems().GetDataTable();2 if (dt ! null)3 {4 …

智能家居數據庫設計_設計更智能的數據表

智能家居數據庫設計重點 (Top highlight)Data tables are hard. There are many different ways to think about them. So, naturally, the first step would be to figure out what your users need.數據表很難。 有許多不同的方式來考慮它們。 因此,自然地&#x…

可能是全網首個前端源碼共讀活動,誠邀你加入一起學習

大家好,我是若川。眾所周知,從8月份開始,我組織了源碼共讀活動,每周學習200行左右的源碼,到現在持續了3個多月,堅持答疑解惑。幫助了不少人,還是挺開心的。另外,涌現了很多優秀的讀者…

vsftpd 的配置項目

基本配置說明: 1)local_root/ftpfile(當本地用戶登入時,將被更換到定義的目錄下,默認值為各用戶的家目錄) 2)anon_root/ftpfile(使用匿名登入時,所登入的目錄) 3)use_localtimeYES(默認是GMT時…

線段樹專輯——pku 3667 Hotel

http://poj.org/problem?id3667 哈哈&#xff0c;經典中的經典題啊。利用線段樹求最大連續空閑區間&#xff0c;并返回空閑區間的起點坐標。 View Code 1 #include<iostream> 2 #include<string> 3 #include<algorithm> 4 using namespace std; 5 6 …

houseparty不流暢_重新設計Houseparty –用戶體驗案例研究

houseparty不流暢Houseparty has become very popular during the COVID-19 period because it helps you connect with others in a fun way. The concept is simple, you open the app and jump on a video call with your friends. You can even play online games with the…

你不知道的 Node.js 工具函數

從類型判斷說起在 JavaScript 中&#xff0c;進行變量的類型校驗是一個非常令人頭疼的事&#xff0c;如果只是簡單的使用 typeof 會到各種各樣的問題。舉幾個簡單的&#x1f330;&#xff1a;console.log(typeof null) // object console.log(typeof new Array) // object cons…

Java應用集群下的定時任務處理方案(mysql)

今天來說一個Java多機部署下定時任務的處理方案。 需求: 有兩臺服務器同時部署了同一套代碼&#xff0c; 代碼中寫有spring自帶的定時任務&#xff0c;但是每次執行定時任務時只需要一臺機器去執行。 當拿到這個需求時我腦子中立馬出現了兩個簡單的解決方案&#xff1a; 利用ip…

概念驗證_設置成功的UX概念驗證

概念驗證用戶體驗/概念證明/第1部分 (USER EXPERIENCE / PROOF OF CONCEPT / PART 1) This is the first article of a four-part series. Please read Part 2 and Part 3.這是由四個部分組成的系列文章的第一篇。 請閱讀 第2 部分 和 第3部分 。 How do today’s top UX desi…