亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

前端JavaScript中的class類

 更新時(shí)間:2021年10月21日 16:46:07   作者:onlythinking  
這篇文章主要介紹了前端JavaScript中的class,類是用于創(chuàng)建對(duì)象的模板,JavaScript中的Class更多的還是語(yǔ)法糖,本質(zhì)上繞不開(kāi)原型鏈,下面就來(lái)看看關(guān)于JavaScript class類的詳細(xì)內(nèi)容吧

1、類

類是用于創(chuàng)建對(duì)象的模板。JavaScript中生成對(duì)象實(shí)例的方法是通過(guò)構(gòu)造函數(shù),這跟主流面向?qū)ο笳Z(yǔ)言(java,C# )寫法上差異較大,如下:

function Point(x, y) {
  this.x = x;
  this.y = y;
}

Point.prototype.toString = function () {
  return '(' + this.x + ', ' + this.y + ')';
};

var p = new Point(1, 1);

ES6 提供了更接近Java語(yǔ)言的寫法,引入了 Class(類)這個(gè)概念,作為對(duì)象的模板。通過(guò)class關(guān)鍵字,可以定義類。

如下:constructor()是構(gòu)造方法,而this代表實(shí)例對(duì)象:

class Point {
  constructor(x, y) {
    this.x = x;
    this.y = y;
  }

  toString() {
    return '(' + this.x + ', ' + this.y + ')';
  }
}

類的數(shù)據(jù)類型就是函數(shù),它本身就是指向函數(shù)的構(gòu)造函數(shù):

// ES5 函數(shù)聲明
function Point() {
 //...
}

// ES6 類聲明
class Point {
  //....
  constructor() {
  }
}
typeof Point // "function"
Point === Point.prototype.constructor // true

在類里面定義的方法是掛到Point.prototype,所以類只是提供了語(yǔ)法糖,本質(zhì)還是原型鏈調(diào)用。

class Point {
  constructor(x, y) {
    this.x = x;
    this.y = y;
  }

  toString() {
    return '(' + this.x + ', ' + this.y + ')';
  }
}

Point.prototype = {
  //....
  toString()
}
var p = new Point(1, 1);
p.toString() // (1,1)

類的另一種定義方式類表達(dá)式

// 未命名/匿名類
let Point = class {
  constructor(x, y) {
    this.x = x;
    this.y = y;
  }
};
Point.name // Point

函數(shù)聲明和類聲明有個(gè)重要區(qū)別,函數(shù)聲明會(huì)提升,類聲明不會(huì)提升。

> let p = new Point(); // 被提升不會(huì)報(bào)錯(cuò)
> function Point() {}
> 
> let p = new Point(); // 報(bào)錯(cuò),ReferenceError
> class Point {}
>

1.1 constructor()

constructor()方法是類的默認(rèn)方法,new生成實(shí)例對(duì)象時(shí)會(huì)自動(dòng)調(diào)用該方法。

一個(gè)類必須有constructor()方法,如果沒(méi)有顯式定義,引擎會(huì)默認(rèn)添加一個(gè)空的constructor() 。

constructor()方法默認(rèn)返回實(shí)例對(duì)象(即this)。

class Point {
}

// 自動(dòng)添加
class Point {
  constructor() {}
}

1.2 getter和setter

ES5 一樣,在類的內(nèi)部可以使用getset關(guān)鍵字,對(duì)某個(gè)屬性設(shè)置存值函數(shù)和取值函數(shù),攔截該屬性的存取行為。

class User {
  constructor(name) {
    this.name = name;
  }

  get name() {
    return this.name;
  }

  set name(value) {
    this.name = value;
  }
}

1.3 this

類的方法內(nèi)部的this,它默認(rèn)指向類的實(shí)例,在調(diào)用存在this的方法時(shí),需要使用 obj.method()方式,否則會(huì)報(bào)錯(cuò)。

class User {
  constructor(name) {
    this.name = name;
  }
  printName(){
    console.log('Name is ' + this.name)
  }
}
const user = new User('jack')
user.printName() // Name is jack
const { printName } = user;
printName()     // 報(bào)錯(cuò) Cannot read properties of undefined (reading 'name')

如果要單獨(dú)調(diào)用又不報(bào)錯(cuò),一種方法可以在構(gòu)造方法里調(diào)用bind(this) 。

class User {
  constructor(name) {
    this.name = name;
    this.printName = this.printName.bind(this);
  }
  printName(){
    console.log('Name is ' + this.name)
  }
}
const user = new User('jack')
const { printName } = user;
printName()     // Name is jack

bind(this) 會(huì)創(chuàng)建一個(gè)新函數(shù),并將傳入的this作為該函數(shù)在調(diào)用時(shí)上下文指向。

另外可以使用箭頭函數(shù),因?yàn)榧^函數(shù)內(nèi)部的this總是指向定義時(shí)所在的對(duì)象。

class User {
  constructor(name) {
    this.name = name;
  }
  printName = () => {
    console.log('Name is ' + this.name)
  }
}
const user = new User('jack')
const { printName } = user;
printName()     // Name is jack

1.4 靜態(tài)屬性

靜態(tài)屬性指的是類本身的屬性,而不是定義在實(shí)例對(duì)象this上的屬性。

class User {
}

User.prop = 1;
User.prop // 1

1.5 靜態(tài)方法

可以在類里面定義靜態(tài)方法,該方法不會(huì)被對(duì)象實(shí)例繼承,而是直接通過(guò)類來(lái)調(diào)用。

靜態(tài)方法里使用this是指向類。

class Utils {
  static printInfo() {
     this.info();
  }
  static info() {
     console.log('hello');
  }
}
Utils.printInfo() // hello

關(guān)于方法的調(diào)用范圍限制,比如:私有公有,ES6暫時(shí)沒(méi)有提供,一般是通過(guò)約定,比如:在方法前面加下劃線_print()表示私有方法。

2、繼承

Java中通過(guò)extends實(shí)現(xiàn)類的繼承。ES6中類也可以通過(guò)extends實(shí)現(xiàn)繼承。

繼承時(shí),子類必須在constructor方法中調(diào)用super方法,否則新建實(shí)例時(shí)會(huì)報(bào)錯(cuò)。

class Point3D extends Point {
  constructor(x, y, z) {
    super(x, y); // 調(diào)用父類的constructor(x, y)
    this.z = z;
  }

  toString() {
    return super.toString() + '  ' + this.z ; // 調(diào)用父類的toString()
  }
}

父類的靜態(tài)方法,也會(huì)被子類繼承

class Parent {
  static info() {
    console.log('hello world');
  }
}

class Child extends Parent {
}

Child.info()  // hello world

2.1 super關(guān)鍵字

在子類的構(gòu)造函數(shù)必須執(zhí)行一次super函數(shù),它代表了父類的構(gòu)造函數(shù)。

class Parent {}

class Child extends Parent {
  constructor() {
    super();
  }
}

在子類普通方法中通過(guò)super調(diào)用父類的方法時(shí),方法內(nèi)部的this指向當(dāng)前的子類實(shí)例。

class Parent {
  constructor() {
    this.x = 1;
    this.y = 10
  }
  printParent() {
    console.log(this.y);
  }
  print() {
    console.log(this.x);
  }
}

class Child extends Parent {
  constructor() {
    super();
    this.x = 2;
  }
  m() {
    super.print();
  }
}

let c = new Child();
c.printParent() // 10
c.m() // 2

2.2 _proto_和prototype

初學(xué)JavaScript時(shí), _proto_prototype 很容易混淆。首先我們知道每個(gè)JS對(duì)象都會(huì)對(duì)應(yīng)一個(gè)原型對(duì)象,并從原型對(duì)象繼承屬性和方法。

  • prototype 一些內(nèi)置對(duì)象和函數(shù)的屬性,它是一個(gè)指針,指向一個(gè)對(duì)象,這個(gè)對(duì)象的用途就是包含所有實(shí)例共享的屬性和方法(我們把這個(gè)對(duì)象叫做原型對(duì)象)。
  • _proto_ 每個(gè)對(duì)象都有這個(gè)屬性,一般指向?qū)?yīng)的構(gòu)造函數(shù)的prototype屬性。

下圖是一些擁有prototype內(nèi)置對(duì)象:

根據(jù)上面描述,看下面代碼

var obj = {} // 等同于 var obj = new Object()

// obj.__proto__指向Object構(gòu)造函數(shù)的prototype
obj.__proto__ === Object.prototype // true 

// obj.toString 調(diào)用方法從Object.prototype繼承
obj.toString === obj.__proto__.toString // true

// 數(shù)組
var arr = []
arr.__proto__ === Array.prototype // true

對(duì)于function對(duì)象,聲明的每個(gè)function同時(shí)擁有prototype__proto__屬性,創(chuàng)建的對(duì)象屬性__proto__指向函數(shù)prototype,函數(shù)的__proto__又指向內(nèi)置函數(shù)對(duì)象(Function)的prototype

function Foo(){}
var f = new Foo();
f.__proto__ === Foo.prototype // true
Foo.__proto__ === Function.prototype // true

2.3 繼承中的__proto__

類作為構(gòu)造函數(shù)的語(yǔ)法糖,也會(huì)同時(shí)有prototype屬性和__proto__屬性,因此同時(shí)存在兩條繼承鏈。

  • 子類的__proto__屬性,表示構(gòu)造函數(shù)的繼承,總是指向父類。
  • 子類prototype屬性的__proto__屬性,表示方法的繼承,總是指向父類的prototype屬性。
class Parent {
}

class Child extends Parent {
}

Child.__proto__ === Parent // true
Child.prototype.__proto__ === Parent.prototype // true

2.4 繼承實(shí)例中的__proto__

子類實(shí)例的__proto__屬性,指向子類構(gòu)造方法的prototype

子類實(shí)例的__proto__屬性的__proto__屬性,指向父類實(shí)例的__proto__屬性。也就是說(shuō),子類的原型的原型,是父類的原型。

class Parent {
}

class Child extends Parent {
}

var p = new Parent();
var c = new Child();

c.__proto__ === p.__proto__ // false
c.__proto__ === Child.prototype // true
c.__proto__.__proto__ === p.__proto__ // true

3、小結(jié)

到此這篇關(guān)于前端JavaScript中的class類的文章就介紹到這了,更多相關(guān)JavaScript中的class內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • JS代理對(duì)象Proxy初體驗(yàn)簡(jiǎn)單的數(shù)據(jù)驅(qū)動(dòng)視圖

    JS代理對(duì)象Proxy初體驗(yàn)簡(jiǎn)單的數(shù)據(jù)驅(qū)動(dòng)視圖

    這篇文章主要為大家介紹了JS代理對(duì)象Proxy初體驗(yàn)簡(jiǎn)單的數(shù)據(jù)驅(qū)動(dòng)視圖,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-08-08
  • JS算法題解搜索插入位置方法示例

    JS算法題解搜索插入位置方法示例

    這篇文章主要為大家介紹了JS算法題解搜索插入位置方法示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-07-07
  • JS中的every()對(duì)空數(shù)組總返回true原理分析

    JS中的every()對(duì)空數(shù)組總返回true原理分析

    這篇文章主要為大家介紹了JS中的every()對(duì)空數(shù)組總返回true原理分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-09-09
  • 自定義range?sliders滑塊實(shí)現(xiàn)元素拖動(dòng)方法

    自定義range?sliders滑塊實(shí)現(xiàn)元素拖動(dòng)方法

    這篇文章主要為大家介紹了自定義range?sliders滑塊實(shí)現(xiàn)元素拖動(dòng)方法,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-08-08
  • 微信小程序之前臺(tái)循環(huán)數(shù)據(jù)綁定

    微信小程序之前臺(tái)循環(huán)數(shù)據(jù)綁定

    這篇文章主要介紹了微信小程序之前臺(tái)循環(huán)數(shù)據(jù)綁定的相關(guān)資料,這里提供實(shí)例幫助大家學(xué)習(xí)理解這部分內(nèi)容,需要的朋友可以參考下
    2017-08-08
  • 微信小程序 tabs選項(xiàng)卡效果的實(shí)現(xiàn)

    微信小程序 tabs選項(xiàng)卡效果的實(shí)現(xiàn)

    這篇文章主要介紹了微信小程序 tabs選項(xiàng)卡效果的實(shí)現(xiàn)的相關(guān)資料,微信小程序內(nèi)部組件沒(méi)有Tabs 選項(xiàng)卡的功能,自己實(shí)現(xiàn)個(gè)類似的,需要的朋友可以參考下
    2017-01-01
  • 前端JavaScript之Promise

    前端JavaScript之Promise

    這篇文章主要介紹關(guān)于前端JavaScript的Promise,Promise 是異步編程的一種解決方案,下面文章我們就來(lái)看看Promise的基本用法及各種方法,需要的朋友可以參考一下,希望對(duì)你有所幫助
    2021-10-10
  • JS實(shí)現(xiàn)頁(yè)面炫酷的時(shí)鐘特效示例

    JS實(shí)現(xiàn)頁(yè)面炫酷的時(shí)鐘特效示例

    這篇文章主要為大家介紹了JS實(shí)現(xiàn)頁(yè)面炫酷的時(shí)鐘特效示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-08-08
  • mitt tiny-emitter發(fā)布訂閱應(yīng)用場(chǎng)景源碼解析

    mitt tiny-emitter發(fā)布訂閱應(yīng)用場(chǎng)景源碼解析

    這篇文章主要為大家介紹了mitt tiny-emitter發(fā)布訂閱應(yīng)用場(chǎng)景源碼解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-12-12
  • 為什么我們要做三份 Webpack 配置文件

    為什么我們要做三份 Webpack 配置文件

    前端從開(kāi)發(fā)到部署前都離不開(kāi) Webpack 的參與,本文結(jié)合了我們自己在開(kāi)發(fā)中碰到的種種問(wèn)題解決方案,同時(shí)借鑒了很多開(kāi)源項(xiàng)目的配置來(lái)介紹一種用 3 個(gè) JS 文件來(lái)配置 Webpack 的方法。
    2017-09-09

最新評(píng)論