function Person(){
this.say = function(){
console.log("Hello");
};
}
var person = new Person();
person.say();
這應(yīng)該是一個奇怪的問題,為什么可以通過person.say的方式訪問say方法。
好像把this去掉,就不能正常輸出結(jié)果了。這個this有什么作用。
我在判斷this指代誰的時候總會告訴自己誰調(diào)用指代誰,而這次,this直接出現(xiàn)在了say前面,我有點糊涂了,感覺自己沒辦法表達清楚自己的問題。
先來看一段 ES6 class 語法的例子
class Person {
say() {
console.log("hello");
}
}
const person = new Person();
person.say();
上面這是采用 class 語法定義的 Person 類,它有一個 say() 方法。運行效果和題主的代碼運行效果一致,但本質(zhì)上還是有些區(qū)別。這段代碼里看不到 this,而 say() 方法也不是定義在 Person 的每個實例對象上,而是定義在 Person 的原型對象中。
如果要把題主的代碼翻譯成 class 語法,應(yīng)該是這樣:
class Person {
constructor() {
this.say = function() {
console.log("hello");
};
}
}
const person = new Person();
person.say();
這里出現(xiàn)了 constructor,即構(gòu)造函數(shù)。構(gòu)造函數(shù)中,通過 this 指針對實例對象添加了一個 say() 方法。如果有多個實現(xiàn),每個實例都有自己的 say() 方法實例,雖然行為一樣,但卻是不同的對象,可以驗證一下
class Person {
constructor() {
this.say = function() {
console.log("hello");
};
}
}
const person = new Person();
const p2 = new Person();
console.log(person.say === p2.say);
// false
這里提到了構(gòu)造函數(shù)。在 ES6 以前,需要定義 JavaScript 類,就是通過構(gòu)造函數(shù)來定義的,然而實際上,構(gòu)造函數(shù)和普通函數(shù)在定義上并沒有多大區(qū)別,當調(diào)用的時候使用了 new 運算符,就是構(gòu)造,沒使用,就是普通函數(shù) 參閱:JavaScript 的 this 指向問題深度解析。
OOP 語言在產(chǎn)生對象的時候一般都是這么一個過程:產(chǎn)生一個對象,從最遠的基類開始依次調(diào)用變量初始化(如果有的話)和構(gòu)造函數(shù),所以調(diào)用構(gòu)造函數(shù)的時候,已經(jīng)存在對象,this 指針已經(jīng)生效,可以在構(gòu)造函數(shù)中使用 this 指針。對于靜態(tài)語言來說,可以通過 this 指針訪問已經(jīng)定義的屬性,或者方法。而 JavaScript 是動態(tài)語言,所以甚至可以使用 this 指針賦予它新的屬性,比如 this.say = ....,當這個屬性是一個函數(shù)表達式的時候,就相當于是在定義新的實例方法(非常確切的實例方法,每個實例一個,各自不同)。
最后,既然是方法,那就可以使用 對象.方法() 的形式來調(diào)用,也就是 person.say()。如果沒有定義,當然也就不能調(diào)用了,也就是題主說的沒效果(實際應(yīng)該報錯)
這個問題很好!這個問題其實闡述了javascript十分核心的知識點:面向?qū)ο缶幊?/code>。從三個方面說說面向?qū)ο缶幊蹋?code>對象、構(gòu)造函數(shù)、new 命令。
對象是單個實物的抽象,也可以說是一個容器,里面包含對象屬性和對象方法。
構(gòu)造函數(shù)是專門用來生成對象的函數(shù)。function Person() {...}。這里Person函數(shù)其實就是一個構(gòu)造函數(shù)!其中構(gòu)造函數(shù)一般有兩個特點:1、構(gòu)造函數(shù)體內(nèi)部使用了this關(guān)鍵字,代表了所要生成的對象實例。2、用new命令生成對象。
new命令的作用,就是執(zhí)行構(gòu)造函數(shù),返回一個實例對象。var person = new Person();這里通過new命令,讓構(gòu)造函數(shù)Person生成了一個實例對象,并保存在變量person中,這個新生成的實例對象,從構(gòu)造函數(shù)Person繼承了say方法,new命令執(zhí)行時,構(gòu)造函數(shù)內(nèi)部的this,就代表了新生成的實例對象,this.say表示實例對象有一個say方法。如果去掉this,say方法就變成了局部方法,外部是無法調(diào)用的。
北大青鳥APTECH成立于1999年。依托北京大學(xué)優(yōu)質(zhì)雄厚的教育資源和背景,秉承“教育改變生活”的發(fā)展理念,致力于培養(yǎng)中國IT技能型緊缺人才,是大數(shù)據(jù)專業(yè)的國家
達內(nèi)教育集團成立于2002年,是一家由留學(xué)海歸創(chuàng)辦的高端職業(yè)教育培訓(xùn)機構(gòu),是中國一站式人才培養(yǎng)平臺、一站式人才輸送平臺。2014年4月3日在美國成功上市,融資1
北大課工場是北京大學(xué)校辦產(chǎn)業(yè)為響應(yīng)國家深化產(chǎn)教融合/校企合作的政策,積極推進“中國制造2025”,實現(xiàn)中華民族偉大復(fù)興的升級產(chǎn)業(yè)鏈。利用北京大學(xué)優(yōu)質(zhì)教育資源及背
博為峰,中國職業(yè)人才培訓(xùn)領(lǐng)域的先行者
曾工作于聯(lián)想擔任系統(tǒng)開發(fā)工程師,曾在博彥科技股份有限公司擔任項目經(jīng)理從事移動互聯(lián)網(wǎng)管理及研發(fā)工作,曾創(chuàng)辦藍懿科技有限責任公司從事總經(jīng)理職務(wù)負責iOS教學(xué)及管理工作。
浪潮集團項目經(jīng)理。精通Java與.NET 技術(shù), 熟練的跨平臺面向?qū)ο箝_發(fā)經(jīng)驗,技術(shù)功底深厚。 授課風格 授課風格清新自然、條理清晰、主次分明、重點難點突出、引人入勝。
精通HTML5和CSS3;Javascript及主流js庫,具有快速界面開發(fā)的能力,對瀏覽器兼容性、前端性能優(yōu)化等有深入理解。精通網(wǎng)頁制作和網(wǎng)頁游戲開發(fā)。
具有10 年的Java 企業(yè)應(yīng)用開發(fā)經(jīng)驗。曾經(jīng)歷任德國Software AG 技術(shù)顧問,美國Dachieve 系統(tǒng)架構(gòu)師,美國AngelEngineers Inc. 系統(tǒng)架構(gòu)師。