先來看一段ES6class語法的例子classPerson{say(){console.log("hello");}}constperson=newPerson();person.say();上面這是采用class語法定義的Person類,它有一個(gè)say()方法。運(yùn)行效果和題主的代碼運(yùn)行效果一致,但本質(zhì)上還是有些區(qū)別。這段代碼里看不到this,而say()方法也不是定義在Person的每個(gè)實(shí)例對(duì)象上,而是定義在Person的原型對(duì)象中。如果要把題主的代碼翻譯成class語法,應(yīng)該是這樣:classPerson{constructor(){this.say=function(){console.log("hello");};}}constperson=newPerson();person.say();這里出現(xiàn)了constructor,即構(gòu)造函數(shù)。構(gòu)造函數(shù)中,通過this指針對(duì)實(shí)例對(duì)象添加了一個(gè)say()方法。如果有多個(gè)實(shí)現(xiàn),每個(gè)實(shí)例都有自己的say()方法實(shí)例,雖然行為一樣,但卻是不同的對(duì)象,可以驗(yàn)證一下classPerson{constructor(){this.say=function(){console.log("hello");};}}constperson=newPerson();constp2=newPerson();console.log(person.say===p2.say);//false這里提到了構(gòu)造函數(shù)。在ES6以前,需要定義JavaScript類,就是通過構(gòu)造函數(shù)來定義的,然而實(shí)際上,構(gòu)造函數(shù)和普通函數(shù)在定義上并沒有多大區(qū)別,當(dāng)調(diào)用的時(shí)候使用了new運(yùn)算符,就是構(gòu)造,沒使用,就是普通函數(shù)參閱:JavaScript的this指向問題深度解析。OOP語言在產(chǎn)生對(duì)象的時(shí)候一般都是這么一個(gè)過程:產(chǎn)生一個(gè)對(duì)象,從最遠(yuǎn)的基類開始依次調(diào)用變量初始化(如果有的話)和構(gòu)造函數(shù),所以調(diào)用構(gòu)造函數(shù)的時(shí)候,已經(jīng)存在對(duì)象,this指針已經(jīng)生效,可以在構(gòu)造函數(shù)中使用this指針。對(duì)于靜態(tài)語言來說,可以通過this指針訪問已經(jīng)定義的屬性,或者方法。而JavaScript是動(dòng)態(tài)語言,所以甚至可以使用this指針賦予它新的屬性,比如this.say=....,當(dāng)這個(gè)屬性是一個(gè)函數(shù)表達(dá)式的時(shí)候,就相當(dāng)于是在定義新的實(shí)例方法(非常確切的實(shí)例方法,每個(gè)實(shí)例一個(gè),各自不同)。最后,既然是方法,那就可以使用對(duì)象.方法()的形式來調(diào)用,也就是person.say()。如果沒有定義,當(dāng)然也就不能調(diào)用了,也就是題主說的沒效果(實(shí)際應(yīng)該報(bào)錯(cuò))