中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

JS怎么使用function實現一個class

發布時間:2022-12-15 10:09:33 來源:億速云 閱讀:151 作者:iii 欄目:開發技術

本文小編為大家詳細介紹“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的實現,我們先一步一步來

Tip1:class只能通過new調用

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
}

Tip2:class中的函數不能被枚舉

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
})

好的,我們離完美又更近了一步。

Tip3:class中的函數不能被new調用

同樣是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,那么相反 不是正常調用的就是錯誤的調用

最后是一個小小的細節

Tip4:在ES6中使用類語法,代碼都是在嚴格模式下運行

所以對于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”文章已經介紹完畢,想要掌握這篇文章的知識點還需要大家自己動手實踐使用過才能領會,如果想了解更多相關內容的文章,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

内乡县| 阿勒泰市| 台东市| 滁州市| 墨玉县| 怀宁县| 汾阳市| 巩义市| 泌阳县| 武城县| 天等县| 西安市| 当阳市| 山东省| 德化县| 延吉市| 青浦区| 抚宁县| 和静县| 巫山县| 金门县| 介休市| 察隅县| 德州市| 安宁市| 峨山| 临高县| 东阳市| 拉萨市| 肥城市| 留坝县| 大同市| 惠东县| 隆昌县| 文昌市| 新蔡县| 佳木斯市| 韶山市| 巴青县| 象州县| 崇阳县|