主頁 > 企業開發 > ES6核心問題是什么?本文詳解

ES6核心問題是什么?本文詳解

2020-09-17 07:40:37 企業開發

1.let 和 const 命令

在es5時,只有兩種變數宣告,var 和function,在es6中新增了四種let和const,以及另外兩種宣告import和class, 我們先講解let和const,后續會補充import和class

(1)let

我們先來看基本語法

{
 let a = 10;
 var b = 1;
}
b // 1
a // ReferenceError: a is not defined.
復制代碼

我們在代碼塊中宣告了a,b,然后a is not defined.這是因為let命令只在對應的代碼塊中有效,我們在外部去參考它,就會報錯,這就是let的塊級作用域的效果,如果不太清楚什么是塊級作用域,我們來看下面的例子

var a = [];
for (var i = 0; i < 10; i++) {
  a[i] = function () {
    console.log(i);
  };
}
a[0]();//10
a[6](); // 10
除了本文案例,接下來我還會在我的裙里用視頻講解的方式給大家拓展下圖中的內容:有興趣的可以來我的扣扣裙 519293536 免費交流學習,我都會盡力幫大家哦,

這是一個老生常談的問題了,i在for回圈中定義的是全域變數,我們在呼叫函式時,函式內部的i參考的是全域的i,所以列印出來的 是10. 我們之前是這樣解決的,

 var a = [];
    for (var i = 0; i < 10; i++) {
        a[i] = (function (a) {
            return function(){
                console.log(a);
            }
        }(i));
    }
    a[0]();//0
    a[6](); // 6
復制代碼

我們使用了立即執行函式將i的值傳入了內部的函式,這樣內部的函式就能夠獲取到對應的i,

我們用let來代替var,最后輸出的是 6,

var a = [];
for (let i = 0; i < 10; i++) {
 a[i] = function () {
   console.log(i);
 };
}
a[6](); // 6
復制代碼

這是因為我們每一次的回圈都生成了一個新的塊級作用域,內部保存著i的值,所以就會列印出6.

let不存在變數提升

   console.log(a);
   console.log(b);
   var a=0;//undefined
   let b=0;//ReferenceError: b is not defined
復制代碼

TDZ(暫時性死區) let命令在塊級作用域中,即使不存在變數提升,它也會影響當前塊級作用域,即系結在了當前作用域,在作用域中參考外部的變數將會報錯,

 var a=10;
  {
      console.log(a);  //ReferenceError: a is not defined
      let a=10;
  }
復制代碼

同時,我們在TDZ中使用typeof也會報錯.

 console.log( typeof a);//undefined
復制代碼
console.log( typeof a);//ReferenceError: a is not defined
  let a=10;
復制代碼

let 不允許重復宣告變數

{
    var a=0;
    let a=1;//SyntaxError: Identifier 'a' has already been declared
}
復制代碼

(2) const常量

const常量宣告一個只讀屬性的變數,不可更改,不可先宣告后賦值,生成塊級作用域,

 const a;//SyntaxError: Missing initializer in const declaration(const宣告中缺少初始值設定項)
 a=10;
復制代碼

它同let有很多相似的地方, .不可重復宣告

const a=10;
var a=10;//SyntaxError: Identifier 'a' has already been declared
復制代碼

.變數不提升

console.log(a)//ReferenceError: a is not defined
const a=10;
復制代碼

.同樣存在暫時性死區

var a=10;
{
    console.log(a);//ReferenceError: a is not defined
    const a=10;
}
復制代碼

另外,const保證常量的值不被修改的原理是什么呢?const實際上無法改變的只是常量在堆疊區的值不變,如果這個值是一個基本資料型別,那么const能夠保障常量的值不變,但如果是參考型別的資料,堆疊區保存的其實是對應常量的地址,地址無法改變,但是對應地址的堆區內容卻可以改變,

 const a=[1,2,3]
 a.push(4)
 console.log(a); //[1, 2, 3, 4]
復制代碼

很顯然,我們通過push,直接修改了堆區的內容,間接改變了const常量的值,

如果要真正做到常量的功能,可以使用Object.freeze()

var a=[1,2,3];
Object.freeze(a)
a.push(4)  //Cannot add property 3, object is not extensibleat Array.push
console.log(a);
復制代碼

2.字串擴展方法

(1)for of字串遍歷

使用for of可以遍歷字串,并將字串分解為單獨的字串

var a='lang'
for (item of a){
  
   console.log(item);
} 
// l
// a
// n
// g
復制代碼

(2) codePointAt字串查詢.

根據下標,查詢對應字串,在Es5時,就有一個charAt()方法,但charAt()顯然沒想到,隨著Unicode編碼的擴展,原先的0x0000~0xFFFF已經無法滿足表示所有字符了,

var text = "??";
text.charAt(0); //''
text.charAt(1); //''
復制代碼

所以es6中新增了codePointAt(),查詢,codePointAt()有著更好的unicode支持,能夠查詢>0xFFFF的字符,

var text = "??";
  console.log(text.codePointAt(0)); //134071 
復制代碼

(3)includes()值存在判斷

在es6之前使用indexof也可以進行值存在判斷,includes與indexof既可以進行字串的判斷,也可以進行陣列值的判斷, 但是indexof在對NaN進行判斷時會出現不準確,

var text = [1,NaN]
console.log(text.indexOf(NaN));//-1
復制代碼

另外,indexof的回傳結果為-1||0,includes為true||false.

(4) repeat()字串重復

str=repeat(n)回傳的是新的字串,并且會將str的字串重復n次,

var a='lang'
console.log(a.repeat(3));//langlanglang
復制代碼

其中n會自動取整,n<=-1||n==infinaty將會報錯,

(5)startwith,endwith,

startWith('str',n):回傳布林值,表示引數字串是否在原字串的頭部,

endsWith('str',n):回傳布林值,表示引數字串是否在原字串的尾部,其中str表示要判斷的值,n表示從目標字串的第幾個元素開始,

 var str='hello world'
 console.log(str.startsWith('hello',0)); //true
 console.log(str.startsWith('world',6)); //true
 console.log(str.startsWith('world',0)); //false
復制代碼

(6)padStart(),padEnd()

es6提供了兩個字串追加的方法String.prototype.padStart和String.prototype.padEnd,方便我們將一個新的字串追加到某個字串的頭尾,

我們常常使用padstart來使字串輸出時保持格式,

 var a='abc'
 var b='abcd'
 var c='abcd'
 console.log(a.padStart('10',0)); 
 console.log(b.padStart('10',0));
 console.log(c.padStart('10',0));
 //0000000abc
 //000000abcd
 //00000abcde
復制代碼

但有時候使用endstart顯然會更好,

var a='abc'
 var b='abcd'
 var c='abcde'
 console.log(a.padEnd(10,'-------')); 
 console.log(b.padEnd(10,'-------'));
 console.log(c.padEnd(10,'-------'));
 //abc-------
 //abcd------
 //abcde-----
復制代碼

也可以組合使用達到效果

var obj={
  name:'wangcai',
  car:'BMW',
  wife:'fatgirl'
}
for(var item in obj){
  console.log(item.padEnd(10,'-')+'value:'+obj[item].padStart(10,'**'));
}
//name------value:***wangcai
//car-------value:*******BMW
//wife------value:***fatgirl
復制代碼

(7)**模板字串

模板字串的引入是es6的一大亮點,它使得輸出模板變得簡潔而方便,模板采用反引號(``),中間支持各種格式的輸出, 包括換行,空格,變數,運算式,呼叫函式等,我們可以在一個模板中組合使用它們

var age=22;
var name='lang'
var say=()=>{
  return 'hello'
}
var str=`myname is${name} my age is ${age} and i can say ${say()}`
console.log(str);  //myname islang my age is 22 and i can say hello
復制代碼

在模板字串的 ${} 中可以寫任意運算式,但是同樣的,對 if / else 判斷、回圈陳述句無法處理,

但在很多時候我們需要去使用if或者回圈,我們可以先在外部使用邏輯處理陳述句,然后生成一個我們想要的模板,在用``進行轉義


var age=22;
var name='lang'
var name2='Lang'
var str=''
var say=()=>{
  return 'hello'
}
if(age>=18){str=name2}
var str=`myname is${str} my age is ${age} and i can say ${say}`
console.log(str);  //myname isLang my age is 22 and i can say hello
復制代碼

當然,我們也可以使用陣列,將各個模板片段存入陣列之中,最后通過Array.join('')將其拼接為最終的模板,

3.數值擴展方法

(1)二進制和八進制表示法

之前在es5時的嚴格模式中,,我們已經無法使用二進制和八進制,在es6中提供了兩個新的二進制和八進制寫法,

二進制(0bxxx||0Bxxx)八進制(0oxxx||0Oxxx)

'use strict'
  var a=0b11;
  var b=0o11
  console.log(a);//3
  console.log(b);//9
復制代碼

(2)Number.isNaN()

isNAN可以用來檢測資料是否是NAN型別,只有NAN才會回傳true,其余型別皆回傳false,

 var x=NaN*2
 console.log(Number.isNaN(x));//true
 console.log(NaN==NaN);//false
 console.log(NaN===NaN);//false
復制代碼

(3)Number.parseInt(), Number.parseFloat()

這兩個方法在es5中已經存在,es6將其從全域物件中提取放入了Number物件中

(4)Number.isIntger()

 var a=3.00
var b=10;
var c=false;
var d=4.00000000000000000000000000000002
console.log(Number.isInteger(a));//true
console.log(Number.isInteger(b));//true
console.log(Number.isInteger(c));//false
console.log(Number.isInteger(d));//true
復制代碼

只有整數,以及類似3.0這樣的浮點數才會被認為是整數,回傳true,除此之外,js運算具有不準確性,超出精度范圍的值,會默認為o,所以4.0000000000000000000000002會被看做是4. (5)Math.trunc()

取整函式,會對值進行取整,會對傳入的值先進行Number()處理,正數將會進行Math.floor(),若為負數則進行Math.ceil();

console.log(Math.trunc(4.1));//4
console.log(Math.trunc(4.9));//4
console.log(Math.trunc(-1.2));//-1
console.log(Math.trunc(-1.9));//-1
console.log(Math.trunc(true));//1
console.log(Math.trunc('lang'));//NaN
復制代碼

3.函式擴展

(1)函式指定默認值 可以為函式傳入的引數指定默認值,函式內部可以覆寫使用,

function say(x,y=5){
    console.log(x,y);  //1,5
    y=10;
    console.log(x,y);  //1,10
  }
  say(1)
復制代碼

需要注意以下兩點

.使用引數默認值時,函式不能有同名引數,

// 不報錯
function foo(x, x, y) {
  // ...
}

// 報錯
function foo(x, x, y = 1) {
  // ...
}
// SyntaxError: Duplicate parameter name not allowed in this context
復制代碼

.不可使用let,const重復宣告

function say(x,y=5){
  let y=10;
  console.log(x,y);  //SyntaxError: Identifier 'y' has already been declared
 }
 say(1)
復制代碼

(2)rest 引數 在函式形參中使用...擴展運算子,可以將不定形參傳入rest陣列中,

function say(...res) {
   for (var item of res) {
     console.log(item);
   }
 }
 say(1, 2, 3)  
 //1
 //2
 //3
復制代碼

(3)箭頭函式(重點)

基本使用方法

 var f=(x,y)=>{ return x+y}
 console.log(f(1,2));  //3
復制代碼

假如(x,y)只有一個引數,我們可以省略(),同樣回傳陳述句中,若只有一條陳述句,也可以省略,

 var f=x=>x+10
 console.log(f(1));  //11
復制代碼

使用注意點 箭頭函式有幾個使用注意點,

(1)函式體內的this物件,就是定義時所在的物件,而不是使用時所在的物件,

(2)不可以當作建構式,也就是說,不可以使用new命令,否則會拋出一個錯誤,

(3)不可以使用arguments物件,該物件在函式體內不存在,如果要用,可以用 rest 引數代替,

(4)不可以使用yield命令,因此箭頭函式不能用作 Generator 函式,

對于需要注意的第一點,我們經常會因為維護回呼函式的this而煩惱,而在箭頭函式中則不存在這個問題,箭頭函式內部的this是固定的,不會因為函式呼叫而改變,

在ES5,我們通常采用外部保存this的方法,來維護this、

// ES6
function foo() {
  setTimeout(() => {
    console.log('id:', this.id);
  }, 100);
}

// ES5
function foo() {
  var that= this;

  setTimeout(function () {
    console.log('id:', that.id);
  }, 100);
}
復制代碼

argumet在箭頭函式中不存在,那么使用argument將會使用外部函式的argument

function foo() {
  setTimeout(() => {
    console.log('args:', arguments);
  }, 100);
}

foo(2, 4, 6, 8)
// args: [2, 4, 6, 8]
復制代碼

(4)尾呼叫

在函式的最后一步呼叫一個函式,這叫做尾呼叫,解釋很簡單,但卻很容易混淆, .最后一步?什么是最后一步,在函式中,return就是最后一步,沒有return的都不是尾呼叫,

 function g(){}
function f(){
  g()  //這不是尾呼叫
}
f()
復制代碼

.即使return后面還有運算式,但這些函式不起作用,那么它依舊是尾呼叫,

 function g(){}
function f(){
   return g()  //這是尾呼叫
   console.log('121');
}
f()
復制代碼

.回傳的必須是函式,不能是運算式,下面額例子中,回傳了g()+1; g()+1;不是一個函式,而是一個運算式,

 function g(){}
function f(){
   return g()+1  //這不是尾呼叫
}
f()
復制代碼

(5)尾遞回

尾遞回是尾呼叫的一種特殊情況,但尾遞回是在最后一步呼叫自身,

我們在使用遞回時,必須給一個終止條件,不然就會產生死回圈

var a=0;
  function f(){
   a++
   return f()  //這顯然是一個死回圈
  }
  f()
復制代碼

我們常常使用遞回等方法來求階乘等,但遞回很容易發生堆疊溢位的情況,

非尾遞回的 Fibonacci 數列實作如下,

function Fibonacci (n) {
  if ( n <= 1 ) {return 1};

  return Fibonacci(n - 1) + Fibonacci(n - 2);
}

Fibonacci(10) // 89
Fibonacci(100) // 堆疊溢位
Fibonacci(500) // 堆疊溢位
復制代碼

尾遞回優化過的 Fibonacci 數列實作如下,

function Fibonacci2 (n , ac1 = 1 , ac2 = 1) {
  if( n <= 1 ) {return ac2};

  return Fibonacci2 (n - 1, ac2, ac1 + ac2);
}

Fibonacci2(100) // 573147844013817200000
Fibonacci2(1000) // 7.0330367711422765e+208
Fibonacci2(10000) // Infinity
復制代碼

4.陣列擴展

(1)擴展運算子(...)

使用擴展運算子可以 能夠直接深拷貝一個陣列,修改一個陣列內的參考值,不會改變另一個值

 var arr=[1,2,3,[4,5],6]
 var a=[...arr];
 console.log(a);//[1, 2, 3, Array(2), 6]
復制代碼

擴展運算子可以用于陣列拼接

 var arr=[1,2,3]
 var arr2=[4,5,6]
 var str='12121'
 var a=[1,...arr,2,...arr2];
復制代碼

另外...arr回傳的并不是一個陣列,而是各個陣列的值,只有[...arr]才是一個陣列,所以...arr,可以用來對方法進行傳值

 var arr=[1,2,3]
function f(x,y,z){
    return x+y+z 
}
console.log(f(...arr));  //6
復制代碼

(2)Array.from()

Array.from()可以將某些偽陣列轉換成真正的陣列結果,什么是偽陣列呢,我們在實際開發中,有兩種常見的偽陣列,arguments和Dom中獲取的元素集合,

<body>
    <p></p>
    <p></p>
    <p></p>
    <p></p>
    <p></p>
</body>
<script> 
 var arr = document.getElementsByTagName('p')
 var arr2 = Array.from(arr)
 console.log(Array.isArray(arr2));//true
復制代碼

同樣能夠將偽陣列轉換陣列的還有兩種方法 .之前提到的擴展運算子

 var arr = document.getElementsByTagName('p')
   var arr2 = [...arr]
   console.log(Array.isArray(arr2));//true
復制代碼

.使用call,apply方法,

 var arr = document.getElementsByTagName('p')
    var newarr=Array.prototype.slice.call(arr,0)
    var newarr=Array.prototype.slice.apply(arr,[0])
    console.log(Array.isArray(newarr));//Var 新陣列 = 舊陣列.slice(起點下標,終點下標)回傳值:陣列,是舊陣列中的一個部分,
    console.log(newarr);
復制代碼

(3)Array.of()

也是用于將一組值,轉換為陣列, Array.of并不是用于將轉換偽陣列的,它的作用是為了彌補Array構造器的不足,之前我們在想要構建一個長度為一的陣列,且值為number型別是無法用Array構建的

var arr=new Array(3)
console.log(arr);//[empty*3]
復制代碼

很顯然,我們想要構建一個[3],可以使用Array.of()

var arr=Array.of(3)
console.log(arr); //[3]
復制代碼

(4)find和findIndex 查詢第一個符合條件值/下標

find:用于找出第一個符合條件的陣列元素,找不回傳 undefined ,

findIndex:回傳第一個符合條件的陣列元素的索引,找不到回傳-1;

var arr=[1,2,3,4,5]
var newarr1=arr.find(function(item,index){return item>2})
var newarr2=arr.findIndex(function(item,index){return item>2})
console.log(newarr1);  //3
console.log(newarr2);  //2
復制代碼

基本語法如上:find和findindex內部是一個回呼函式,需要回傳一個查詢條件,find則會執行這個回傳條件,查詢第一個滿足條件的值,findindex則會回傳下標, 我們可以直接用箭頭函式進行簡寫

var arr=[1,2,3,4,5]
var newarr1=arr.find(item=>item>2)
var newarr2=arr.findIndex(item=>item>2)
console.log(newarr1);  //3
console.log(newarr2);  //2
復制代碼

(5)fill 填充初始化陣列

作用:給陣列填充指定值,fill 方法用于空陣列的初始化非常方便,已有資料會被覆寫, fill 方法還可以接受第二個和第三個引數,用于指定填充的起始位置和結束位置

var arr=[1,2,3,4,5]
  arr.fill('*',1,3)
  console.log(arr);//[1, "*", "*", 4, 5]
復制代碼

5.物件擴展

(1).屬性的簡寫

屬性名是可以簡寫的,但是有前提條件:屬性的值是一個變數 變數名稱和鍵名是一致的,

var name ='lang'
var age=22;
var obj={
name:name,
age:age
}
復制代碼

像這樣的物件,我們就可以進行簡寫

var name ='lang'
var age=22;
var obj={
name,
age,
}
復制代碼

前提是屬性名和屬性值必須一致,

(2)方法的簡寫

var obj={
say:function(){}
}
復制代碼

簡寫為

var obj={
say(){}
}
復制代碼

(3)精細化設定物件的屬性

屬性的四個特征:

1.configurable: 是否可以洗掉, 默認為true 可以洗掉:

2.writable: 是否可以修改, 默認為ture, 可以修改:

3.enumerable: 是否可以列舉,可以使用 for in 默認為ture, 可以列舉:

4.value: 值, 默認值為undefined

格式1:Object.defineProperty(物件名,“屬性名”,{上面的四個特征});

var obj={
  name:'lang',
  age:22
}
 Object.defineProperty('obj','name',{
   configurable:false,
   writable:false,
   enumerable:false
 })
復制代碼

格式2:Object.defineProperties(物件名,{屬性名{四個特征}},{屬性名{四個特征}}});

  var obj = {
   name: 'lang',
   age: 22
 }
 Object.defineProperties(obj, {
   name: {
     configurable: false,
     writable: false,
     enumerable: false
   },
   age: {
     configurable: false,
     writable: false,
     enumerable: false
   }
 })
復制代碼

(4)獲取精細化設定物件的屬性

Obect.getOwnProertyDescriptor(物件,屬性名) 可以獲取物件的精細化屬性里面的值,

var obj={
name:'lang',
age:22
}
Object.defineProperty(obj,'name',{
 configurable:false,
 writable:false,
 enumerable:false
})

console.log(Object.getOwnPropertyDescriptor(obj,'name'));
復制代碼

 

 

(5)Object.keys()

使用Object.getOwnPropertyNames()和Object.keys()都可以得到一個物件的屬性名,屬性名是放在一個陣列中的,

var obj={
name:'lang',
age:22
}
console.log(Object.keys(obj));   //["name", "age"]
復制代碼

那么我們目前有三種遍歷物件的方法了 對于物件的遍歷目前有三種方式:

        1. for in

        2.Object.keys()

        3.Object.getOwnPropertyNames()
復制代碼

for in : 會輸出自身以及原型鏈上可列舉的屬性,

Object.keys() : 用來獲取物件自身可列舉的屬性鍵

Object.getOwnPropertyNames() : 用來獲取物件自身的全部屬性名

(6)Object.values();

獲取物件的值,放入陣列中,

var obj={
  name:'lang',
  age:22
}
console.log(Object.values(obj));   //["lang", 22]
復制代碼

6.解構賦值

解構賦值語法是一個 Javascript 運算式,這使得可以將值從陣列或屬性從物件提取到不同的變數中,

物件字面量和陣列字面量提供了一種簡單的定義一個特定的資料組的方法,

let x = [1, 2, 3, 4, 5];
復制代碼

解構賦值使用了相同的語法,不同的是在運算式左邊定義了要從原變數中取出什么變數,

var x = [1, 2, 3, 4, 5];
var [y, z] = x;
console.log(y); // 1
console.log(z); // 2
復制代碼

(1)陣列的解構

變數宣告并賦值時的解構

var foo = ["one", "two", "three"];

var [one, two, three] = foo;
console.log(one); // "one"
console.log(two); // "two"
console.log(three); // "three"
Link to section變數先宣告后賦值時的解構
復制代碼

通過解構分離變數的宣告,可以為一個變數賦值,

var a, b;

[a, b] = [1, 2];
console.log(a); // 1
console.log(b); // 2
Link to section默認值
復制代碼

為了防止從陣列中取出一個值為undefined的物件,可以為這個物件設定默認值,

var a, b;

[a=5, b=7] = [1];
console.log(a); // 1
console.log(b); // 7
Link to section交換變數
復制代碼

在一個解構運算式中可以交換兩個變數的值,

沒有解構賦值的情況下,交換兩個變數需要一個臨時變數(或者用低級語言中的XOR-swap技巧),

var a = 1;
var b = 3;

[a, b] = [b, a];
console.log(a); // 3
console.log(b); // 1
Link to section決議一個從函式回傳的陣列
復制代碼

從一個函式回傳一個陣列是十分常見的情況.,解構使得處理回傳值為陣列時更加方便,

在下面例子中,[1, 2] 作為函式的 f() 的輸出值,可以使用解構用一句話完成決議,

function f() {
  return [1, 2];
}

var a, b; 
[a, b] = f(); 
console.log(a); // 1
console.log(b); // 2
復制代碼

(2)物件的解構

基本賦值

var o = {p: 42, q: true};
var {p, q} = o;

console.log(p); // 42
console.log(q); // true
復制代碼

給新的變數名賦值

可以從一個物件中提取變數并賦值給和物件屬性名不同的新的變數名,

var o = {p: 42, q: true};
var {p: foo, q: bar} = o;
 
console.log(foo); // 42 
console.log(bar); // true
復制代碼

默認值

變數可以先賦予默認值,當要提取的物件沒有對應的屬性,變數就被賦予默認值,

var {a = 10, b = 5} = {a: 3};

console.log(a); // 3
console.log(b); // 5
復制代碼

混合解構(嵌套物件和陣列) 解構嵌套物件和陣列

var metadata = https://www.cnblogs.com/chengxuyuanaa/p/{
    title: "Scratchpad",
    translations: [
       {
        locale: "de",
        localization_tags: [ ],
        last_edit: "2014-04-14T08:43:37",
        url: "/de/docs/Tools/Scratchpad",
        title: "JavaScript-Umgebung"
       }
    ],
    url: "/en-US/docs/Tools/Scratchpad"
};

var { title: englishTitle, translations: [{ title: localeTitle }] } = metadata;

console.log(englishTitle); // "Scratchpad"
console.log(localeTitle);  // "JavaScript-Umgebung"
復制代碼

7.class類

之前在es5中,我們如何去實作一個類的功能呢?我們通常采用構造器的方法去實作,然而,使用構造器去模仿類的實作并不方便,不僅需要經常維護this,而且在繼承的時候更是不僅需要使用call拷貝父類的基本數值,還需要繼承父類的原型來繼承方法,我們簡單來看看代碼就知道了

   function Parent(name) {
        this.name = name;
    }
    Parent.prototype.sayName = function () {
        console.log('parent name:', this.name);
    }

    function Child(name, parentName) {
        Parent.call(this, parentName);
        this.name = name;
    }

    function inheritPrototype(Parent, Child) {
        Child.prototype = Object.create(Parent.prototype);   //修改
        Child.prototype.constructor = Child;
    }

    inheritPrototype(Parent, Child);

    Child.prototype.sayName = function () {
        console.log('child name:', this.name);
    }

    var parent = new Parent('father');
    parent.sayName();      // parent name: father

    var child = new Child('son', 'father');
    child.sayName();       // child name: son
復制代碼

在es6中,我們可以直接使用class來定義,如果你有Java基礎的話,那么理解起來將非常簡單, 基本上,ES6 的class可以看作只是一個語法糖,它的絕大部分功能,ES5 都可以做到,新的class寫法只是讓物件原型的寫法更加清晰、更像面向物件編程的語法而已,

//定義類
class Point {
 constructor(x, y) {
   this.x = x;
   this.y = y;
 }

 toString() {
   return '(' + this.x + ', ' + this.y + ')';
 }
}
復制代碼

我們使用typeof去檢測class的資料型別,會發現class類的本質就是一個方法,也就是構造器,我們不僅僅可以使用new方法來新建一個類,我們也可以使用prototype來訪問類的原型,

(1)constructor

可以看到里面有一個constructor方法,這就是構造方法,而this關鍵字則代表實體物件,這里面通常保存著類基本資料型別

(2)定義類方法

我們可以直接在類中添加自己的方法,前面不需要加上function這個關鍵字,另外,為了使類更加的符合大眾的寫法,去掉了逗號分隔,我們不需要在方法之間使用逗號進行分隔,

(3)類的繼承

es6還給類提供了一個extends的繼承方法,使用方法與java如出一轍,

 class NBAPlayer2 {
       constructor(name, height) {
           this.name = name;
           this.height = height;
       }
       say() {
           console.log(`name is${this.name} height is${this.height}`);
       }
   }
   class MVP2 extends NBAPlayer {
       constructor(name, height, year) {
           super(name, height)
           this.year = year
       }
       say() {
           console.log(`name is${this.name} height is${this.height} mvpyear is${this.year}`);
       }
   }
   var n1 = new MVP2('老庫里', '201', '2016')
   var m1 = new NBAPlayer2('老庫里', '201')
   n1.say()
   m1.say()
復制代碼

注意:使用 extends 關鍵字來實作繼承在子類中的構造器 constructor 中,必須要顯式呼叫父類的 super 方法,如果不呼叫,則 this 不可用

我們如果使用原型去查看父子類,就會發現,他們其實是通過原型鏈來進行繼承的,

結尾

ES6的新特性還有很多,本次只概述了一些較為常用的方法,適合初識es6的人對es6進行一個大概的了解,

關于es6的更多特性,將會在后續進行補充,具體重要內容還有以下

1.Promise 物件

2.Generator

3.async 函式

4.Module 語法
接下來我還會在我的裙里用視頻講解的方式給大家拓展下圖中的內容:有興趣的可以來我的扣扣裙 519293536 免費交流學習,我都會盡力幫大家哦,

本文的文字及圖片來源于網路加上自己的想法,僅供學習、交流使用,不具有任何商業用途,著作權歸原作者所有,如有問題請及時聯系我們以作處理

轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/63850.html

標籤:JavaScript

上一篇:最新ES6+中陣列的拓展總結,面試必備

下一篇:Vue結合路由配置遞回實作選單欄

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • IEEE1588PTP在數字化變電站時鐘同步方面的應用

    IEEE1588ptp在數字化變電站時鐘同步方面的應用 京準電子科技官微——ahjzsz 一、電力系統時間同步基本概況 隨著對IEC 61850標準研究的不斷深入,國內外學者提出基于IEC61850通信標準體系建設數字化變電站的發展思路。數字化變電站與常規變電站的顯著區別在于程序層傳統的電流/電壓互 ......

    uj5u.com 2020-09-10 03:51:52 more
  • HTTP request smuggling CL.TE

    CL.TE 簡介 前端通過Content-Length處理請求,通過反向代理或者負載均衡將請求轉發到后端,后端Transfer-Encoding優先級較高,以TE處理請求造成安全問題。 檢測 發送如下資料包 POST / HTTP/1.1 Host: ac391f7e1e9af821806e890 ......

    uj5u.com 2020-09-10 03:52:11 more
  • 網路滲透資料大全單——漏洞庫篇

    網路滲透資料大全單——漏洞庫篇漏洞庫 NVD ——美國國家漏洞庫 →http://nvd.nist.gov/。 CERT ——美國國家應急回應中心 →https://www.us-cert.gov/ OSVDB ——開源漏洞庫 →http://osvdb.org Bugtraq ——賽門鐵克 →ht ......

    uj5u.com 2020-09-10 03:52:15 more
  • 京準講述NTP時鐘服務器應用及原理

    京準講述NTP時鐘服務器應用及原理京準講述NTP時鐘服務器應用及原理 安徽京準電子科技官微——ahjzsz 北斗授時原理 授時是指接識訓通過某種方式獲得本地時間與北斗標準時間的鐘差,然后調整本地時鐘使時差控制在一定的精度范圍內。 衛星導航系統通常由三部分組成:導航授時衛星、地面檢測校正維護系統和用戶 ......

    uj5u.com 2020-09-10 03:52:25 more
  • 利用北斗衛星系統設計NTP網路時間服務器

    利用北斗衛星系統設計NTP網路時間服務器 利用北斗衛星系統設計NTP網路時間服務器 安徽京準電子科技官微——ahjzsz 概述 NTP網路時間服務器是一款支持NTP和SNTP網路時間同步協議,高精度、大容量、高品質的高科技時鐘產品。 NTP網路時間服務器設備采用冗余架構設計,高精度時鐘直接來源于北斗 ......

    uj5u.com 2020-09-10 03:52:35 more
  • 詳細解讀電力系統各種對時方式

    詳細解讀電力系統各種對時方式 詳細解讀電力系統各種對時方式 安徽京準電子科技官微——ahjzsz,更多資料請添加VX 衛星同步時鐘是我京準公司開發研制的應用衛星授時時技術的標準時間顯示和發送的裝置,該裝置以M國全球定位系統(GLOBAL POSITIONING SYSTEM,縮寫為GPS)或者我國北 ......

    uj5u.com 2020-09-10 03:52:45 more
  • 如何保證外包團隊接入企業內網安全

    不管企業規模的大小,只要企業想省錢,那么企業的某些服務就一定會采用外包的形式,然而看似美好又經濟的策略,其實也有不好的一面。下面我通過安全的角度來聊聊使用外包團的安全隱患問題。 先看看什么服務會使用外包的,最常見的就是話務/客服這種需要大量重復性、無技術性的服務,或者是一些銷售外包、特殊的職能外包等 ......

    uj5u.com 2020-09-10 03:52:57 more
  • PHP漏洞之【整型數字型SQL注入】

    0x01 什么是SQL注入 SQL是一種注入攻擊,通過前端帶入后端資料庫進行惡意的SQL陳述句查詢。 0x02 SQL整型注入原理 SQL注入一般發生在動態網站URL地址里,當然也會發生在其它地發,如登錄框等等也會存在注入,只要是和資料庫打交道的地方都有可能存在。 如這里http://192.168. ......

    uj5u.com 2020-09-10 03:55:40 more
  • [GXYCTF2019]禁止套娃

    git泄露獲取原始碼 使用GET傳參,引數為exp 經過三層過濾執行 第一層過濾偽協議,第二層過濾帶引數的函式,第三層過濾一些函式 preg_replace('/[a-z,_]+\((?R)?\)/', NULL, $_GET['exp'] (?R)參考當前正則運算式,相當于匹配函式里的引數 因此傳遞 ......

    uj5u.com 2020-09-10 03:56:07 more
  • 等保2.0實施流程

    流程 結論 ......

    uj5u.com 2020-09-10 03:56:16 more
最新发布
  • 使用Django Rest framework搭建Blog

    在前面的Blog例子中我們使用的是GraphQL, 雖然GraphQL的使用處于上升趨勢,但是Rest API還是使用的更廣泛一些. 所以還是決定回到傳統的rest api framework上來, Django rest framework的官網上給了一個很好用的QuickStart, 我參考Qu ......

    uj5u.com 2023-04-20 08:17:54 more
  • 記錄-new Date() 我忍你很久了!

    這里給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 大家平時在開發的時候有沒被new Date()折磨過?就是它的諸多怪異的設定讓你每每用的時候,都可能不小心踩坑。造成程式意外出錯,卻一下子找不到問題出處,那叫一個煩透了…… 下面,我就列舉它的“四宗罪”及應用思考 可惡的四宗罪 1. Sa ......

    uj5u.com 2023-04-20 08:17:47 more
  • 使用Vue.js實作文字跑馬燈效果

    實作文字跑馬燈效果,首先用到 substring()截取 和 setInterval計時器 clearInterval()清除計時器 效果如下: 實作代碼如下: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta ......

    uj5u.com 2023-04-20 08:12:31 more
  • JavaScript 運算子

    JavaScript 運算子/運算子 在 JavaScript 中,有一些運算子可以使代碼更簡潔、易讀和高效。以下是一些常見的運算子: 1、可選鏈運算子(optional chaining operator) ?.是可選鏈運算子(optional chaining operator)。?. 可選鏈操 ......

    uj5u.com 2023-04-20 08:02:25 more
  • CSS—相對單位rem

    一、概述 rem是一個相對長度單位,它的單位長度取決于根標簽html的字體尺寸。rem即root em的意思,中文翻譯為根em。瀏覽器的文本尺寸一般默認為16px,即默認情況下: 1rem = 16px rem布局原理:根據CSS媒體查詢功能,更改根標簽的字體尺寸,實作rem單位隨螢屏尺寸的變化,如 ......

    uj5u.com 2023-04-20 08:02:21 more
  • 我的第一個NPM包:panghu-planebattle-esm(胖虎飛機大戰)使用說明

    好家伙,我的包終于開發完啦 歡迎使用胖虎的飛機大戰包!! 為你的主頁添加色彩 這是一個有趣的網頁小游戲包,使用canvas和js開發 使用ES6模塊化開發 效果圖如下: (覺得圖片太sb的可以自己改) 代碼已開源!! Git: https://gitee.com/tang-and-han-dynas ......

    uj5u.com 2023-04-20 08:01:50 more
  • 如何在 vue3 中使用 jsx/tsx?

    我們都知道,通常情況下我們使用 vue 大多都是用的 SFC(Signle File Component)單檔案組件模式,即一個組件就是一個檔案,但其實 Vue 也是支持使用 JSX 來撰寫組件的。這里不討論 SFC 和 JSX 的好壞,這個仁者見仁智者見智。本篇文章旨在帶領大家快速了解和使用 Vu ......

    uj5u.com 2023-04-20 08:01:37 more
  • 【Vue2.x原始碼系列06】計算屬性computed原理

    本章目標:計算屬性是如何實作的?計算屬性快取原理以及洋蔥模型的應用?在初始化Vue實體時,我們會給每個計算屬性都創建一個對應watcher,我們稱之為計算屬性watcher ......

    uj5u.com 2023-04-20 08:01:31 more
  • http1.1與http2.0

    一、http是什么 通俗來講,http就是計算機通過網路進行通信的規則,是一個基于請求與回應,無狀態的,應用層協議。常用于TCP/IP協議傳輸資料。目前任何終端之間任何一種通信方式都必須按Http協議進行,否則無法連接。tcp(三次握手,四次揮手)。 請求與回應:客戶端請求、服務端回應資料。 無狀態 ......

    uj5u.com 2023-04-20 08:01:10 more
  • http1.1與http2.0

    一、http是什么 通俗來講,http就是計算機通過網路進行通信的規則,是一個基于請求與回應,無狀態的,應用層協議。常用于TCP/IP協議傳輸資料。目前任何終端之間任何一種通信方式都必須按Http協議進行,否則無法連接。tcp(三次握手,四次揮手)。 請求與回應:客戶端請求、服務端回應資料。 無狀態 ......

    uj5u.com 2023-04-20 08:00:32 more