ES6,記錄的20多問(wèn)題,你都會(huì)嗎?

一、問(wèn):ES6是什么,為什么要學(xué)習(xí)它,不學(xué)習(xí)ES6會(huì)怎么樣?

答: ES6是新一代的JS語(yǔ)言標(biāo)準(zhǔn),對(duì)分JS語(yǔ)言核心內(nèi)容做了升級(jí)優(yōu)化,規(guī)范了JS使用標(biāo)準(zhǔn),新增了JS原生方法,使得JS使用更加規(guī)范,更加優(yōu)雅,更適合大型應(yīng)用的開(kāi)發(fā)。學(xué)習(xí)ES6是成為專業(yè)前端正規(guī)軍的必經(jīng)之路。不學(xué)習(xí)ES6也可以寫(xiě)代碼打鬼子,但是最多只能當(dāng)個(gè)游擊隊(duì)長(zhǎng)。

二、問(wèn):ES5、ES6和ES2015有什么區(qū)別?

答: ES2015特指在2015年發(fā)布的新一代JS語(yǔ)言標(biāo)準(zhǔn),ES6泛指下一代JS語(yǔ)言標(biāo)準(zhǔn),包含ES2015、ES2016、ES2017、ES2018等?,F(xiàn)階段在絕大部分場(chǎng)景下,ES2015默認(rèn)等同ES6。ES5泛指上一代語(yǔ)言標(biāo)準(zhǔn)。ES2015可以理解為ES5和ES6的時(shí)間分界線。

三、問(wèn):babel是什么,有什么作用?

答:babel是一個(gè) ES6 轉(zhuǎn)碼器,可以將 ES6 代碼轉(zhuǎn)為 ES5 代碼,以便兼容那些還沒(méi)支持ES6的平臺(tái)。

四、問(wèn):let有什么用,有了var為什么還要用let?

答: 在ES6之前,聲明變量只能用var,var方式聲明變量其實(shí)是很不合理的,準(zhǔn)確的說(shuō),是因?yàn)镋S5里面沒(méi)有塊級(jí)作用域是很不合理的,甚至可以說(shuō)是一個(gè)語(yǔ)言層面的bug(這也是很多c++、java開(kāi)發(fā)人員看不懂,也瞧不起JS語(yǔ)言的劣勢(shì)之一)。沒(méi)有塊級(jí)作用域回來(lái)帶很多難以理解的問(wèn)題,比如for循環(huán)var變量泄露,變量覆蓋等問(wèn)題。let 聲明的變量擁有自己的塊級(jí)作用域,且修復(fù)了var聲明變量帶來(lái)的變量提升問(wèn)題。

五、問(wèn):舉一些ES6對(duì)String字符串類(lèi)型做的常用升級(jí)優(yōu)化?

答:

1、優(yōu)化部分:
ES6新增了字符串模板,在拼接大段字符串時(shí),用反斜杠(`)取代以往的字符串相加的形式,能保留所有空格和換行,使得字符串拼接看起來(lái)更加直觀,更加優(yōu)雅。

2、升級(jí)部分:
ES6在String原型上新增了includes()方法,用于取代傳統(tǒng)的只能用indexOf查找包含字符的方法(indexOf返回-1表示沒(méi)查到不如includes方法返回false更明確,語(yǔ)義更清晰), 此外還新增了startsWith(), endsWith(), padStart(),padEnd(),repeat()等方法,可方便的用于查找,補(bǔ)全字符串。

六、問(wèn):舉一些ES6對(duì)Array數(shù)組類(lèi)型做的常用升級(jí)優(yōu)化?

1、優(yōu)化部分:
a. 數(shù)組解構(gòu)賦值。ES6可以直接以let [a,b,c] = [1,2,3]形式進(jìn)行變量賦值,在聲明較多變量時(shí),不用再寫(xiě)很多l(xiāng)et(var),且映射關(guān)系清晰,且支持賦默認(rèn)值。
b. 擴(kuò)展運(yùn)算符。ES6新增的擴(kuò)展運(yùn)算符(...)(重要),可以輕松的實(shí)現(xiàn)數(shù)組和松散序列的相互轉(zhuǎn)化,可以取代arguments對(duì)象和apply方法,輕松獲取未知參數(shù)個(gè)數(shù)情況下的參數(shù)集合。(尤其是在ES5中,arguments并不是一個(gè)真正的數(shù)組,而是一個(gè)類(lèi)數(shù)組的對(duì)象,但是擴(kuò)展運(yùn)算符的逆運(yùn)算卻可以返回一個(gè)真正的數(shù)組)。擴(kuò)展運(yùn)算符還可以輕松方便的實(shí)現(xiàn)數(shù)組的復(fù)制和解構(gòu)賦值(let a = [2,3,4]; let b = [...a])

七、問(wèn):舉一些ES6對(duì)Number數(shù)字類(lèi)型做的常用升級(jí)優(yōu)化?

答:

1、優(yōu)化部分:
ES6在Number原型上新增了isFinite(), isNaN()方法,用來(lái)取代傳統(tǒng)的全局isFinite(), isNaN()方法檢測(cè)數(shù)值是否有限、是否是NaN。ES5的isFinite(), isNaN()方法都會(huì)先將非數(shù)值類(lèi)型的參數(shù)轉(zhuǎn)化為Number類(lèi)型再做判斷,這其實(shí)是不合理的,最造成isNaN('NaN') === true的奇怪行為--'NaN'是一個(gè)字符串,但是isNaN卻說(shuō)這就是NaN。而Number.isFinite()和Number.isNaN()則不會(huì)有此類(lèi)問(wèn)題(Number.isNaN('NaN') === false)。(isFinite()同上)

2、升級(jí)部分:
ES6在Math對(duì)象上新增了Math.cbrt(),trunc(),hypot()等等較多的科學(xué)計(jì)數(shù)法運(yùn)算方法,可以更加全面的進(jìn)行立方根、求和立方根等等科學(xué)計(jì)算。

八、問(wèn):舉一些ES6對(duì)Object類(lèi)型做的常用升級(jí)優(yōu)化?(重要)

答:

1、優(yōu)化部分:
a. 對(duì)象屬性變量式聲明。ES6可以直接以變量形式聲明對(duì)象屬性或者方法,。比傳統(tǒng)的鍵值對(duì)形式聲明更加簡(jiǎn)潔,更加方便,語(yǔ)義更加清晰。

let [apple, orange] = ['red appe', 'yellow orange'];
let myFruits = {apple, orange};    // let myFruits = {apple: 'red appe', orange: 'yellow orange'};

尤其在對(duì)象解構(gòu)賦值(見(jiàn)優(yōu)化部分b.)或者模塊輸出變量時(shí),這種寫(xiě)法的好處體現(xiàn)的最為明顯:

let {keys, values, entries} = Object;
let MyOwnMethods = {keys, values, entries}; // let MyOwnMethods = {keys: keys, values: values, entries: entries}

可以看到屬性變量式聲明屬性看起來(lái)更加簡(jiǎn)潔明了。方法也可以采用簡(jiǎn)潔寫(xiě)法:

let es5Fun = {
    method: function(){}
}; 
let es6Fun = {
    method(){}
}

b. 對(duì)象的解構(gòu)賦值。 ES6對(duì)象也可以像數(shù)組解構(gòu)賦值那樣,進(jìn)行變量的解構(gòu)賦值:

let {apple, orange} = {apple: 'red appe', orange: 'yellow orange'};

c. 對(duì)象的擴(kuò)展運(yùn)算符(...)。 ES6對(duì)象的擴(kuò)展運(yùn)算符和數(shù)組擴(kuò)展運(yùn)算符用法本質(zhì)上差別不大,畢竟數(shù)組也就是特殊的對(duì)象。對(duì)象的擴(kuò)展運(yùn)算符一個(gè)最最常用也最好用的用處就在于可以輕松的取出一個(gè)目標(biāo)對(duì)象內(nèi)部全部或者部分的可遍歷屬性,從而進(jìn)行對(duì)象的合并和分解。

let {apple, orange, ...otherFruits} = {apple: 'red apple', orange: 'yellow orange', grape: 'purple grape', peach: 'sweet peach'}; 
// otherFruits  {grape: 'purple grape', peach: 'sweet peach'}
// 注意: 對(duì)象的擴(kuò)展運(yùn)算符用在解構(gòu)賦值時(shí),擴(kuò)展運(yùn)算符只能用在最有一個(gè)參數(shù)(otherFruits后面不能再跟其他參數(shù))
let moreFruits = {watermelon: 'nice watermelon'};
let allFruits = {apple, orange, ...otherFruits, ...moreFruits};

d. super 關(guān)鍵字。ES6在Class類(lèi)里新增了類(lèi)似this的關(guān)鍵字super。同this總是指向當(dāng)前函數(shù)所在的對(duì)象不同,super關(guān)鍵字總是指向當(dāng)前函數(shù)所在對(duì)象的原型對(duì)象

2、升級(jí)部分:

a. ES6在Object原型上新增了is()方法,做兩個(gè)目標(biāo)對(duì)象的相等比較,用來(lái)完善'==='方法。'==='方法中NaN === NaN //false其實(shí)是不合理的,Object.is修復(fù)了這個(gè)小bug。(Object.is(NaN, NaN) // true)

b. ES6在Object原型上新增了assign()方法,用于對(duì)象新增屬性或者多個(gè)對(duì)象合并。

const target = { a: 1 };
const source1 = { b: 2 };
const source2 = { c: 3 };
Object.assign(target, source1, source2);
target // {a:1, b:2, c:3

注意: assign合并的對(duì)象target只能合并source1、source2中的自身屬性,并不會(huì)合并source1、source2中的繼承屬性,也不會(huì)合并不可枚舉的屬性,且無(wú)法正確復(fù)制get和set屬性(會(huì)直接執(zhí)行g(shù)et/set函數(shù),取return的值)。
c. ES6在Object原型上新增了getOwnPropertyDescriptors()方法,此方法增強(qiáng)了ES5中g(shù)etOwnPropertyDescriptor()方法,可以獲取指定對(duì)象所有自身屬性的描述對(duì)象。結(jié)合defineProperties()方法,可以完美復(fù)制對(duì)象,包括復(fù)制get和set屬性。

d. ES6在Object原型上新增了getPrototypeOf()和setPrototypeOf()方法,用來(lái)獲取或設(shè)置當(dāng)前對(duì)象的prototype對(duì)象。這個(gè)方法存在的意義在于,ES5中獲取設(shè)置prototype對(duì)像是通過(guò)proto屬性來(lái)實(shí)現(xiàn)的,然而proto屬性并不是ES規(guī)范中的明文規(guī)定的屬性,只是瀏覽器各大產(chǎn)商“私自”加上去的屬性,只不過(guò)因?yàn)檫m用范圍廣而被默認(rèn)使用了,再非瀏覽器環(huán)境中并不一定就可以使用,所以為了穩(wěn)妥起見(jiàn),獲取或設(shè)置當(dāng)前對(duì)象的prototype對(duì)象時(shí),都應(yīng)該采用ES6新增的標(biāo)準(zhǔn)用法。

d. ES6在Object原型上還新增了Object.keys(),Object.values(),Object.entries()方法,用來(lái)獲取對(duì)象的所有鍵、所有值和所有鍵值對(duì)數(shù)組。

九、問(wèn):舉一些ES6對(duì)Function函數(shù)類(lèi)型做的常用升級(jí)優(yōu)化?(重要)

答:
1、優(yōu)化部分:
a. 箭頭函數(shù)(核心)。箭頭函數(shù)是ES6核心的升級(jí)項(xiàng)之一,箭頭函數(shù)里沒(méi)有自己的this,這改變了以往JS函數(shù)中最讓人難以理解的this運(yùn)行機(jī)制。主要優(yōu)化點(diǎn):

Ⅰ. 箭頭函數(shù)內(nèi)的this指向的是函數(shù)定義時(shí)所在的對(duì)象,而不是函數(shù)執(zhí)行時(shí)所在的對(duì)象。ES5函數(shù)里的this總是指向函數(shù)執(zhí)行時(shí)所在的對(duì)象,這使得在很多情況下this的指向變得很難理解,尤其是非嚴(yán)格模式情況下,this有時(shí)候會(huì)指向全局對(duì)象,這甚至也可以歸結(jié)為語(yǔ)言層面的bug之一。ES6的箭頭函數(shù)優(yōu)化了這一點(diǎn),它的內(nèi)部沒(méi)有自己的this,這也就導(dǎo)致了this總是指向上一層的this,如果上一層還是箭頭函數(shù),則繼續(xù)向上指,直到指向到有自己this的函數(shù)為止,并作為自己的this。

Ⅱ. 箭頭函數(shù)不能用作構(gòu)造函數(shù),因?yàn)樗鼪](méi)有自己的this,無(wú)法實(shí)例化。
Ⅲ. 也是因?yàn)榧^函數(shù)沒(méi)有自己的this,所以箭頭函數(shù) 內(nèi)也不存在arguments對(duì)象。(可以用擴(kuò)展運(yùn)算符代替)

b. 函數(shù)默認(rèn)賦值。ES6之前,函數(shù)的形參是無(wú)法給默認(rèn)值得,只能在函數(shù)內(nèi)部通過(guò)變通方法實(shí)現(xiàn)。ES6以更簡(jiǎn)潔更明確的方式進(jìn)行函數(shù)默認(rèn)賦值。

function es6Fuc (x, y = 'default') {
    console.log(x, y);
}
es6Fuc(4) // 4, default

2、升級(jí)部分:
ES6新增了雙冒號(hào)運(yùn)算符,用來(lái)取代以往的bind,call,和apply。

foo::bar;
// 等同于
bar.bind(foo);

foo::bar(...arguments);
// 等同于
bar.apply(foo, arguments);
十、問(wèn):Symbol是什么,有什么作用?

答: Symbol是ES6引入的第七種原始數(shù)據(jù)類(lèi)型,所有Symbol()生成的值都是獨(dú)一無(wú)二的,可以從根本上解決對(duì)象屬性太多導(dǎo)致屬性名沖突覆蓋的問(wèn)題。對(duì)象中Symbol()屬性不能被for...in遍歷,但是也不是私有屬性。

十一、問(wèn):Set是什么,有什么作用?

答: Set是ES6引入的一種類(lèi)似Array的新的數(shù)據(jù)結(jié)構(gòu),Set實(shí)例的成員類(lèi)似于數(shù)組item成員,區(qū)別是Set實(shí)例的成員都是唯一,不重復(fù)的。這個(gè)特性可以輕松地實(shí)現(xiàn)數(shù)組去重。

十二、問(wèn):Map是什么,有什么作用?

答: Map是ES6引入的一種類(lèi)似Object的新的數(shù)據(jù)結(jié)構(gòu),Map可以理解為是Object的超集,打破了以傳統(tǒng)鍵值對(duì)形式定義對(duì)象,對(duì)象的key不再局限于字符串,也可以是Object??梢愿尤娴拿枋鰧?duì)象的屬性

十三、問(wèn):Proxy是什么,有什么作用?

答: Proxy是ES6新增的一個(gè)構(gòu)造函數(shù),可以理解為JS語(yǔ)言的一個(gè)代理,用來(lái)改變JS默認(rèn)的一些語(yǔ)言行為,包括攔截默認(rèn)的get/set等底層方法,使得JS的使用自由度更高,可以最大限度的滿足開(kāi)發(fā)者的需求。比如通過(guò)攔截對(duì)象的get/set方法,可以輕松地定制自己想要的key或者value。下面的例子可以看到,隨便定義一個(gè)myOwnObj的key,都可以變成自己想要的函數(shù)。

function createMyOwnObj() {
    //想把所有的key都變成函數(shù),或者Promise,或者anything
    return new Proxy({}, {
        get(target, propKey, receiver) {
            return new Promise((resolve, reject) => {
                setTimeout(() => {
                    let randomBoolean = Math.random() > 0.5;
                    let Message;
                    if (randomBoolean) {
                        Message = `你的${propKey}運(yùn)氣不錯(cuò),成功了`;
                        resolve(Message);
                    } else {
                        Message = `你的${propKey}運(yùn)氣不行,失敗了`;
                        reject(Message);
                    }
                }, 1000);
            });
        }
    });
}

let myOwnObj = createMyOwnObj();

myOwnObj.hahaha.then(result => {
    console.log(result) //你的hahaha運(yùn)氣不錯(cuò),成功了
}).catch(error => {
    console.log(error) //你的hahaha運(yùn)氣不行,失敗了
})

myOwnObj.wuwuwu.then(result => {
    console.log(result) //你的wuwuwu運(yùn)氣不錯(cuò),成功了
}).catch(error => {
    console.log(error) //你的wuwuwu運(yùn)氣不行,失敗了
})

十四、問(wèn):Reflect是什么,有什么作用?
答:  Reflect是ES6引入的一個(gè)新的對(duì)象,他的主要作用有兩點(diǎn),一是將原生的一些零散分布在Object、Function或者全局函數(shù)里的方法(如apply、delete、get、set等等),統(tǒng)一整合到Reflect上,這樣可以更加方便更加統(tǒng)一的管理一些原生API。其次就是因?yàn)镻roxy可以改寫(xiě)默認(rèn)的原生API,如果一旦原生API別改寫(xiě)可能就找不到了,所以Reflect也可以起到備份原生API的作用,使得即使原生API被改寫(xiě)了之后,也可以在被改寫(xiě)之后的API用上默認(rèn)的API。
十五、問(wèn):Promise是什么,有什么作用?

答: Promise是ES6引入的一個(gè)新的對(duì)象,他的主要作用是用來(lái)解決JS異步機(jī)制里,回調(diào)機(jī)制產(chǎn)生的“回調(diào)地獄”。它并不是什么突破性的API,只是封裝了異步回調(diào)形式,使得異步回調(diào)可以寫(xiě)的更加優(yōu)雅,可讀性更高,而且可以鏈?zhǔn)秸{(diào)用。

十六、問(wèn):Iterator是什么,有什么作用?(重要)

答: Iterator是ES6中一個(gè)很重要概念,它并不是對(duì)象,也不是任何一種數(shù)據(jù)類(lèi)型。因?yàn)镋S6新增了Set、Map類(lèi)型,他們和Array、Object類(lèi)型很像,Array、Object都是可以遍歷的,但是Set、Map都不能用for循環(huán)遍歷,解決這個(gè)問(wèn)題有兩種方案,一種是為Set、Map單獨(dú)新增一個(gè)用來(lái)遍歷的API,另一種是為Set、Map、Array、Object新增一個(gè)統(tǒng)一的遍歷API,顯然,第二種更好,ES6也就順其自然的需要一種設(shè)計(jì)標(biāo)準(zhǔn),來(lái)統(tǒng)一所有可遍歷類(lèi)型的遍歷方式。Iterator正是這樣一種標(biāo)準(zhǔn)?;蛘哒f(shuō)是一種規(guī)范理念。
就好像JavaScript是ECMAScript標(biāo)準(zhǔn)的一種具體實(shí)現(xiàn)一樣,Iterator標(biāo)準(zhǔn)的具體實(shí)現(xiàn)是Iterator遍歷器。Iterator標(biāo)準(zhǔn)規(guī)定,所有部署了key值為[Symbol.iterator],且[Symbol.iterator]的value是標(biāo)準(zhǔn)的Iterator接口函數(shù)(標(biāo)準(zhǔn)的Iterator接口函數(shù): 該函數(shù)必須返回一個(gè)對(duì)象,且對(duì)象中包含next方法,且執(zhí)行next()能返回包含value/done屬性的Iterator對(duì)象)的對(duì)象,都稱之為可遍歷對(duì)象,next()后返回的Iterator對(duì)象也就是Iterator遍歷器。

//obj就是可遍歷的,因?yàn)樗裱薎terator標(biāo)準(zhǔn),且包含[Symbol.iterator]方法,方法函數(shù)也符合標(biāo)準(zhǔn)的Iterator接口規(guī)范。
//obj.[Symbol.iterator]() 就是Iterator遍歷器
let obj = {
  data: [ 'hello', 'world' ],
  [Symbol.iterator]() {
    const self = this;
    let index = 0;
    return {
      next() {
        if (index < self.data.length) {
          return {
            value: self.data[index++],
            done: false
          };
        } else {
          return { value: undefined, done: true };
        }
      }
    };
  }
};

ES6給Set、Map、Array、String都加上了[Symbol.iterator]方法,且[Symbol.iterator]方法函數(shù)也符合標(biāo)準(zhǔn)的Iterator接口規(guī)范,所以Set、Map、Array、String默認(rèn)都是可以遍歷的。

//Array
let array = ['red', 'green', 'blue'];
array[Symbol.iterator]() //Iterator遍歷器
array[Symbol.iterator]().next() //{value: "red", done: false}

//String
let string = '1122334455';
string[Symbol.iterator]() //Iterator遍歷器
string[Symbol.iterator]().next() //{value: "1", done: false}

//set
let set = new Set(['red', 'green', 'blue']);
set[Symbol.iterator]() //Iterator遍歷器
set[Symbol.iterator]().next() //{value: "red", done: false}

//Map
let map = new Map();
let obj= {map: 'map'};
map.set(obj, 'mapValue');
map[Symbol.iterator]().next()  {value: Array(2), done: false}
十八、Generator函數(shù)是什么,有什么作用?

答: 如果說(shuō)JavaScript是ECMAScript標(biāo)準(zhǔn)的一種具體實(shí)現(xiàn)、Iterator遍歷器是Iterator的具體實(shí)現(xiàn),那么Generator函數(shù)可以說(shuō)是Iterator接口的具體實(shí)現(xiàn)方式。
執(zhí)行Generator函數(shù)會(huì)返回一個(gè)遍歷器對(duì)象,每一次Generator函數(shù)里面的yield都相當(dāng)一次遍歷器對(duì)象的next()方法,并且可以通過(guò)next(value)方法傳入自定義的value,來(lái)改變Generator函數(shù)的行為。
Generator函數(shù)可以通過(guò)配合Thunk 函數(shù)更輕松更優(yōu)雅的實(shí)現(xiàn)異步編程和控制流管理。

十九、async函數(shù)是什么,有什么作用?

答: async函數(shù)可以理解為內(nèi)置自動(dòng)執(zhí)行器的Generator函數(shù)語(yǔ)法糖,它配合ES6的Promise近乎完美的實(shí)現(xiàn)了異步編程解決方案。

二十、Class、extends是什么,有什么作用?

答: ES6 的class可以看作只是一個(gè)ES5生成實(shí)例對(duì)象的構(gòu)造函數(shù)的語(yǔ)法糖。它參考了java語(yǔ)言,定義了一個(gè)類(lèi)的概念,讓對(duì)象原型寫(xiě)法更加清晰,對(duì)象實(shí)例化更像是一種面向?qū)ο缶幊獭lass類(lèi)可以通過(guò)extends實(shí)現(xiàn)繼承。它和ES5構(gòu)造函數(shù)的不同點(diǎn):
a. 類(lèi)的內(nèi)部定義的所有方法,都是不可枚舉的。

///ES5
function ES5Fun (x, y) {
    this.x = x;
    this.y = y;
}
ES5Fun.prototype.toString = function () {
     return '(' + this.x + ', ' + this.y + ')';
}
var p = new ES5Fun(1, 3);
p.toString();
Object.keys(ES5Fun.prototype); //['toString']

//ES6
class ES6Fun {
    constructor (x, y) {
        this.x = x;
        this.y = y;
    }
    toString () {
        return '(' + this.x + ', ' + this.y + ')';
    }
}

Object.keys(ES6Fun.prototype); //[]

b.ES6的class類(lèi)必須用new命令操作,而ES5的構(gòu)造函數(shù)不用new也可以執(zhí)行。
c.ES6的class類(lèi)不存在變量提升,必須先定義class之后才能實(shí)例化,不像ES5中可以將構(gòu)造函數(shù)寫(xiě)在實(shí)例化之后。
d.ES5 的繼承,實(shí)質(zhì)是先創(chuàng)造子類(lèi)的實(shí)例對(duì)象this,然后再將父類(lèi)的方法添加到this上面。ES6 的繼承機(jī)制完全不同,實(shí)質(zhì)是先將父類(lèi)實(shí)例對(duì)象的屬性和方法,加到this上面(所以必須先調(diào)用super方法),然后再用子類(lèi)的構(gòu)造函數(shù)修改this。

二十一、日常前端代碼開(kāi)發(fā)中,有哪些值得用ES6去改進(jìn)的編程優(yōu)化或者規(guī)范?

1、常用箭頭函數(shù)來(lái)取代var self = this;的做法。

2、常用let取代var命令。

3、常用數(shù)組/對(duì)象的結(jié)構(gòu)賦值來(lái)命名變量,結(jié)構(gòu)更清晰,語(yǔ)義更明確,可讀性更好。

4、在長(zhǎng)字符串多變量組合場(chǎng)合,用模板字符串來(lái)取代字符串累加,能取得更好地效果和閱讀體驗(yàn)。

5、用Class類(lèi)取代傳統(tǒng)的構(gòu)造函數(shù),來(lái)生成實(shí)例化對(duì)象。

6、在大型應(yīng)用開(kāi)發(fā)中,要保持module模塊化開(kāi)發(fā)思維,分清模塊之間的關(guān)系,常用import、export方法。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容