您好,登錄后才能下訂單哦!
本文小編為大家詳細介紹“JS怎么使用function實現一個class”,內容詳細,步驟清晰,細節處理妥當,希望這篇“JS怎么使用function實現一個class”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來學習新知識吧。
使用function來寫出一個class的類對于我們來說當然是簡單的,但必須注意的是,要做好function實現一個class,那么就要必須實現達到高精準度的模仿,把該實現的細節都實現好,才能更好的對class進行深入的理解
開始寫出我們的class
class MyClass{ constructor(name){ this.name = name } fun(){ console.log('myName:'+this.name) } }
這是一個平平無奇的class,接著我們使用function來對其進行一下實現。
function MyClass1(name){ this.name = name } MyClass1.prototype.fun = function(){ console.log('myName:'+this.name) } let m1 = new MyClass1('aaa') m1.fun() //myName:aaa
讓我們繼續完善一下function的實現,我們先一步一步來
class MyClass{ constructor(name){ this.name = name } fun(){ console.log('myName:'+this.name) } } // MyClass('aaa') //TypeError: Class constructor MyClass cannot be invoked without 'new'
對于類的調用,只能通過new來進行實例化,而不能通過直接調用,下面我們在function來實現這個操作
如何判斷是通過new調用而不是通過直接調用,這個時候this的熟練度就顯得比較重要了,不熟悉也不要急,讓我們一起來打印看看
function MyClass1(name){ console.log(this) this.name = name } let m1 = new MyClass1('aaa') //MyClass1 {} MyClass1('aaa') //window
對于new調用,函數內部的this指向構造函數 (new綁定)
直接調用 那么很明顯this指向的是全局(默認綁定)
根據這個特點,在構造函數里面判斷this的指向,從而拋出報錯,即可實現class的效果
function MyClass1(name){ console.log(this) if(!(this instanceof MyClass)){ //如果this不是指向MyClass throw new TypeError('TypeError: Class constructor MyClass cannot be invoked without 'new'') } this.name = name }
let m = new MyClass('aaa') for(let i in m){ console.log(i) //name } let m1 = new MyClass1('aaa') for(let i in m1){ console.log(i) //name fn }
從上可以看出類中的函數不能被枚舉出來,枚舉
我們就想到了enumerable,也就是Object.defineProperty來對原型上的fn進行設置
'use strict' function MyClass1(name){ this.name = name } Object.defineProperty(MyClass1.prototype,'fn',{ value:function(){ console.log('myName:'+this.name) }, enumerable:false })
好的,我們離完美又更近了一步。
同樣是new調用的方式,不能對類中的函數進行new調用
let m = new MyClass('aaa') new m.fun() //TypeError: m.fun is not a constructor
在這里會拋出一個錯誤,所以在用function實現類的時候也要避免這個問題,function中的函數都是可以通過new來進行調用的,我們來進行修改,有了上面對new的判斷經驗,很容易來解決這個問題
Object.defineProperty(MyClass1.prototype,'fn',{ value:function(){ //不可通過new調用 console.log(this) //正常調用下的this是指向實例 MyClass1 { name: 'aaa' } if(!(this instanceof MyClass1){//那么相反 不是正常調用的就是錯誤的調用 //error } console.log('myName:'+this.name) }, enumerable:false })
同樣使用this的判斷來看下是不是通過new的調用,正常調用下的this是指向實例 MyClass1,那么相反 不是正常調用的就是錯誤的調用
最后是一個小小的細節
所以對于function的代碼,需要在前面加上’user strict‘
'use strict' function MyClass1(name){ this.name = name } Object.defineProperty(MyClass1.prototype,'fn',{ value:function(){ console.log(this) if(!(this instanceof MyClass1)){ //error throw TypeError('error') } console.log('myName:'+this.name) }, enumerable:false }) let m1 = new MyClass1('aaa') m1.fn() // new m1.fn() //error for(let i in m1){ console.log(i) //name }
讀到這里,這篇“JS怎么使用function實現一個class”文章已經介紹完畢,想要掌握這篇文章的知識點還需要大家自己動手實踐使用過才能領會,如果想了解更多相關內容的文章,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。