国产成人精品久久免费动漫-国产成人精品天堂-国产成人精品区在线观看-国产成人精品日本-a级毛片无码免费真人-a级毛片毛片免费观看久潮喷

您的位置:首頁技術文章
文章詳情頁

javascript - 關于JS的this和構造函數問題

瀏覽:121日期:2023-06-03 17:23:39

問題描述

function People() {}People.prototype.say = function () { alert('hello');}function Student() {}Student.prototype = new People();var superSay = Student.prototype.say;Student.prototype.say = function () { superSay.call(this); // 為什么會是'hello'? alert('stu-hello');}var s = new Student();s.say();如代碼中注釋,superSay.call(this)為什么會是People.prototype.say函數被調用?this指向誰?

問題解答

回答1:

this指向Student{}類,這個你可以在superSay.call(this)上面加一行console.log(this)進行驗證。javascript - 關于JS的this和構造函數問題

然后,我們看這個代碼

Student.prototype = new People();

為了方便后面解釋,我把這里的new People()創建的實例稱為實例X。由于superSay = Student.prototype.say,因為上面的Student.prototype = new People();,所以其中Student.prototype為實例X。所以實際上superSay調用的是實例X的say,而并非People.prototype.say。

至于你為啥覺得是在調用People.prototype.say,主要還是原型鏈的問題。實例X是People類的一個實例,所以實例X的所有方法會從People類的原型鏈“繼承”(用繼承這個詞,但是實際上JS的原型鏈和繼承還是有些區別的)。所以實例X.say如果沒有針對實例X重寫say方法,那么實例X的say就和People.prototype.say等效。

另外,superSay.call(this)這個里面的call,只是改變了this的上下文而已。但是由于superSay即實例X.say,這個方法里根本沒有this,所以this上下文的修改并不影響運行的結果。

javascript - 關于JS的this和構造函數問題

回答2:

這個問題在js中經常遇見

回答3:

個人觀點:先說下查找say方法的查找順序吧:s——student.prototype——people.prototype——Object,找到則就緒,停止查找。結合你的代碼,say只會查找到student.prototype。這里可以先把你的代碼先改成這樣就比較清晰:

People.prototype.say = function () {console.log(123); } People.prototype.jiao = function () {console.log(456); } Student.prototype.say = function () { console.log(321) }

其他不變。此時s.say()——輸出321,s.jiao()——輸出456。然后再回到你的代碼,因為你這是重寫了sdudent.prototype.say方法所以會執行此段代碼

Student.prototype.say = function () {superSay.call(this); // 為什么會是'hello'?alert('stu-hello'); }

第一句superSay.call(this),首先superSay是一個變量,變量類型是function,你可以在 var superSay = Student.prototype.say后面加上一段代碼console.log(typeof supperSay),于是你只是在調用這個函數,而這個變量儲存的是Student.prototype.say。執行到var superSay = Student.prototype.say,其實這里賦值的是 People.prototype.say。這點在高程的166-167頁有類似的。關于這點你可以再把你的代碼這2段換成這樣,其他不變。

var superSay = Student.prototype.say; Student.prototype = new People();

此時調用superSay 會報錯,因為此時執行到var superSay = Student.prototype.say時;student.prototype只有一個constructer屬性沒有say方法。然后回到你的代碼此時People.prototype.say會賦值給superSay

綜上第一句代碼會輸出hello,而你的call根本沒什么用第二句就不用說了。關于this其實我也不是特別清楚。我原來還認為console.log(this)會輸出S,結果輸出student,還需繼續學習?;卮?:

把superSay構造函數中的this綁定為Student.prototype.

回答5:

樓上扯這么多不怕樓主蒙圈嗎

他程序里面stuSay指向的是function () {alert('hello');} 這個匿名函數對象,只要你不重新賦值stuSay,他一直就是指向這個函數對象,管你在什么地方調用,永遠就是這么個結果,至于在函數體內部this指向誰,你看下犀牛書吧....

樓主把犀牛書函數部分看完就不會有這些問題了,至于樓上扯那么多,真別把樓主扯暈了

標簽: JavaScript
相關文章:
主站蜘蛛池模板: 国产成人欧美一区二区三区的 | 国产精品特级毛片一区二区三区 | 成 人 黄 色 视频 免费观看 | 日韩免费一级毛片 | 国产成人高清一区二区私人 | 手机看片福利在线 | 亚洲精品一区二区三区国产 | zztt40.su黑料不打烊官网 | 加勒比一本一道在线 | 日本一区二区三区在线 视频 | 国产精品九九 | 一级做a爰片久久毛片鸭王 一级做a爰全过程免费视频毛片 | 中文国产成人精品久久一区 | 黄篇网址 | 精品久久久久久免费影院 | 亚洲超大尺度激情啪啪人体 | 日韩免费观看一级毛片看看 | 国产亚洲精品一区二区三区 | 精品国产欧美一区二区五十路 | 一级特黄aaa大片在 一级特黄aaa大片在线观看 | 91热成人精品国产免费 | 国产午夜亚洲精品第一区 | 一级做性色a爰片久久毛片免费 | 免费 欧美 自拍 在线观看 | 国产成人夜间影院在线观看 | 精品伊人久久久久7777人 | 成人a大片高清在线观看 | 大黄一级片 | 中国欧美一级毛片免费 | chinese多姿势videos | 国产一级一级毛片 | 久草黄视频 | 91免费永久在线地址 | 国产精品日韩欧美一区二区三区 | 国产精品_国产精品_国产精品 | 久久精品国产三级不卡 | 午夜性爽快免费视频播放 | 怡红院亚洲怡红院首页 | 亚洲无吗 | 国产成人高清精品免费软件 | 成年午夜性视频免费播放 |