問題
什麼是建構子?
構造函數與普通函數區別是什麼?
用new關鍵字的時候到底做了什麼?
建構函數有回傳值怎麼辦?
構造函數能當普通函數呼叫嗎?
以下是我的一些理解,理解錯誤的地方懇請大家幫忙指正,謝謝!
this
this永遠指向目前正在被執行的函數或方法的owner。例如:
function test(){ console.log(this); } test(); //Window {top: Window, window: Window, location: Location, external: Object, chrome: Object…}
上面這段程式碼中,我們在頁面中定義了一個test()函數,然後在頁面中呼叫。函數定義在全域時,其owner就是目前頁面,也就是window物件。
this指向的幾種情況
1.全域中呼叫
this.name //this指向window物件
2.函數呼叫
test();//test()函數中的this也指向window物件
3.物件的方法呼叫
obj1.fn();//obj1物件的fn()方法中的this指向obj1
4.呼叫建構子
var dog=new Dog();//建構子內的this指向新創建的實例對象,也就是這裡的dogcall和apply
call和apply的作用一樣,只是接受參數的方式不一樣,call接受的是多個單一參數,apply接受的是參數陣列。
call和apply的作用簡單地可以說成,當一個物件實例缺少一個函數/方法時,可以呼叫其他物件的現成函數/方法,其方式是透過取代其中的this為這個物件實例,改變函數運行時的上下文。
例如:
function Dog(){ this.sound="汪汪汪"; } Dog.prototype.bark=function(){ alert(this.sound); }
現在我有另一個cat物件:
var cat={sound:'喵喵喵'}
我也想讓這個cat物件可以呼叫bark方法,這時候就不用重新為它定義bark方法了,可以用call/apply呼叫Dog類別的bark方法:
Dog.prototype.bark.call(cat);
或:
dog.bark.call(cat);
加點東西,變成一個帶有參數的栗子:
function Dog(){ this.sound="汪汪汪"; } Dog.prototype.bark=function(words){ alert(this.sound+" "+words); } var dog=new Dog(); dog.bark("有小偷");//alert:汪汪汪 有小偷 Dog.prototype.bark.call(cat,"饿了");//alert:喵喵喵 饿了
普通函數
這是一個簡單的普通函數:
function fn(){ alert("hello sheila"); } fn();//alert:hello sheila
普通函數與建構子比較有四個明顯特點:
1.不需要用new關鍵字呼叫
fn();2.可以用return語句回傳值
function fn(a,b){ return a+b; } alert(fn(2,3));//alert:5
3.函數內部不建議使用this關鍵字
我們說不建議使用,當然硬要用是可以的,只是要注意這時候發生了什麼事。如果在普通函數內部使用this關鍵字定義變數或函數,因為這時候this指向的是window全域對象,這樣無意間就會為window添加了一些全域變數或函數。
function greeting(){ this.name="sheila"; alert("hello "+this.name); } greeting();//alert:hello sheila alert(window.name);//alert:sheila
4.函數命名以駝峰方式,首字母小寫
建構子
在JavaScript中,用new關鍵字來呼叫定義的建構子。預設回傳的是一個新對象,這個新對象具有建構函數定義的變數和函數/方法。
舉個栗子:
function Prince(name,age){ this.gender="male"; this.kind=true; this.rich=true; this.name=name; this.age=age; } Prince.prototype.toFrog=function(){ console.log("Prince "+this.name+" turned into a frog."); } var prince=new Prince("charming",25); prince.toFrog();//Prince charming turned into a frog. prince.kind;//true
与普通函数相比,构造函数有以下明显特点:
1.用new关键字调用
var prince=new Prince("charming",25);
2.函数内部可以使用this关键字
在构造函数内部,this指向的是构造出的新对象。用this定义的变量或函数/方法,就是实例变量或实例函数/方法。需要用实例才能访问到,不能用类型名访问。
prince.age;//25
Prince.age;//undefined
3.默认不用return返回值
构造函数是不需要用return显式返回值的,默认会返回this,也就是新的实例对象。当然,也可以用return语句,返回值会根据return值的类型而有所不同,细节将在下文介绍。
4.函数命名建议首字母大写,与普通函数区分开。
不是命名规范中的,但是建议这么写。
使用new关键字实例化的时候发生了什么?
以上文中的Prince()函数举个栗子:
1.第一步,创建一个空对象。
var prince={}
2.第二步,将构造函数Prince()中的this指向新创建的对象prince。
3.第三步,将prince的_proto_属性指向Prince函数的prototype,创建对象和原型间关系
4.第四步,执行构造函数Prince()内的代码。
构造函数有return值怎么办?
构造函数里没有显式调用return时,默认是返回this对象,也就是新创建的实例对象。
当构造函数里调用return时,分两种情况:
1.return的是五种简单数据类型:String,Number,Boolean,Null,Undefined。
这种情况下,忽视return值,依然返回this对象。
2.return的是Object
这种情况下,不再返回this对象,而是返回return语句的返回值。
function Person(name){ this.name=name; return {name:"cherry"} } var person=new Person("sheila"); person.name;//cherry p;//Object {name: "cherry"}

JavaScript核心數據類型在瀏覽器和Node.js中一致,但處理方式和額外類型有所不同。 1)全局對像在瀏覽器中為window,在Node.js中為global。 2)Node.js獨有Buffer對象,用於處理二進制數據。 3)性能和時間處理在兩者間也有差異,需根據環境調整代碼。

JavaScriptusestwotypesofcomments:single-line(//)andmulti-line(//).1)Use//forquicknotesorsingle-lineexplanations.2)Use//forlongerexplanationsorcommentingoutblocksofcode.Commentsshouldexplainthe'why',notthe'what',andbeplacedabovetherelevantcodeforclari

Python和JavaScript的主要區別在於類型系統和應用場景。 1.Python使用動態類型,適合科學計算和數據分析。 2.JavaScript採用弱類型,廣泛用於前端和全棧開發。兩者在異步編程和性能優化上各有優勢,選擇時應根據項目需求決定。

選擇Python還是JavaScript取決於項目類型:1)數據科學和自動化任務選擇Python;2)前端和全棧開發選擇JavaScript。 Python因其在數據處理和自動化方面的強大庫而備受青睞,而JavaScript則因其在網頁交互和全棧開發中的優勢而不可或缺。

Python和JavaScript各有優勢,選擇取決於項目需求和個人偏好。 1.Python易學,語法簡潔,適用於數據科學和後端開發,但執行速度較慢。 2.JavaScript在前端開發中無處不在,異步編程能力強,Node.js使其適用於全棧開發,但語法可能複雜且易出錯。

javascriptisnotbuiltoncorc; sanInterpretedlanguagethatrunsonenginesoftenwritteninc.1)JavascriptwasdesignedAsignedAsalightWeight,drackendedlanguageforwebbrowsers.2)Enginesevolvedfromsimpleterterpretpretpretpretpreterterpretpretpretpretpretpretpretpretpretcompilerers,典型地,替代品。

JavaScript可用於前端和後端開發。前端通過DOM操作增強用戶體驗,後端通過Node.js處理服務器任務。 1.前端示例:改變網頁文本內容。 2.後端示例:創建Node.js服務器。

選擇Python還是JavaScript應基於職業發展、學習曲線和生態系統:1)職業發展:Python適合數據科學和後端開發,JavaScript適合前端和全棧開發。 2)學習曲線:Python語法簡潔,適合初學者;JavaScript語法靈活。 3)生態系統:Python有豐富的科學計算庫,JavaScript有強大的前端框架。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

SublimeText3漢化版
中文版,非常好用

Dreamweaver Mac版
視覺化網頁開發工具

SublimeText3 英文版
推薦:為Win版本,支援程式碼提示!