標籤:好的 object 注釋 目的 應該 win js對象 執行 如何
這幾天跟幾個同事聊天發現他們對javascript什麼時候該用new都不是很瞭解。
1、javascript的function什麼時候該new什麼時候不該new?
我覺得主要的問題還是集中在javascript的弱類型上面。
new在幹什麼
首先我們知道new是幹什麼,以我們java或.net的語言經驗顯然在創造對象。是的,不管是java還是.net。他是在建立一個對象。
new後面是什麼
那麼我們考慮一下new的後面是什麼,(java和.net)一般是被一個class修飾的類名稱。那麼我們考慮一下,我們執行個體一個對象是幹什麼或者說設計者的目的是什麼,那麼一般情況下對象都會包含這些成員,屬性與行為或者其中之一(我們在javaEE中DAO只有行為,POJO只有屬性),有沒有看到過既沒有屬性也沒有行為的對象(當然類可以這麼設計,但是沒有意義)。
javascript的new幹了什麼
那麼javascript的new幹了什嗎?new其實開闢了記憶體空間建立了一個object這個object就是this,然後這個this的prototype指向了函數本身的prototype。
也就是說去new一個function的時候,開闢了一個this,這個this就是對象本身,再想想你去執行個體一個對象。你要拿到對象的成員,屬性或方法或其中之一。this本身有幾種方式能聲明成員,一種在function函數體內部用this.的方式聲明,例如:this.a = ‘123‘,其實就是給他的a屬性賦了一個‘123’字串,當然也可以賦值行為。還有種方式就是通過原型繼承,通過function函數的.prototype的方式。
好了,因為javascript是弱類型,他沒有class修飾,沒有是否有傳回值修飾,只有一個function修飾。所以function是否是建構函式很難通過函數頭知道。所以是否需要去new就需要你去揣摩function的目的,他到底是不是建構函式。
執行個體代碼說明
既然他是弱類型,他們可以根據內部的條件選擇到底是做建構函式用,還是做普通函數用。再加上我們很多程式員都是其他語言出身,很少有人系統的學習了javascript,所以就很混淆。
下面我們來看混淆的例子吧。
Js代碼
- function Hello() {
- this.a = ‘123‘;
- this.b = function () {
- alert(‘b‘);
- }
-
- return this;
- }
-
- Hello.prototype.c = function() {
- alert(‘c‘);
- }
- var aHello = new Hello();
- var bHello = Hello();
- alert(aHello.a)
- alert(bHello.a)
- aHello.b();
- bHello.b();
- aHello.c();
- bHello.c();
你會發現bHello.c()是執行不了的。在看看上面的函數,他為什麼既能new又能不new。
new其實開闢了記憶體空間建立了一個object這個object就是this,然後這個this的prototype指向了函數本身的prototype。
不new就是執行了這個函數,最後return this就是返回了這個執行函數的宿主,其實就是window本身。
所以c函數是綁定在Hello的prototype上的,所以window上根本沒有。
但是就出現了一個問題,就是如果在不執行c方法或者c本身不是通過原型繼承的方式的話(就是不通過Hello的prototype方式,通過直接給this賦值的方式),其實建立的this的內容和window增加的內容是一樣的,程式員會本能的以為new和不new是一樣的。這樣就掉坑裡去了。
總結:javascript弱類型語言,一個函數即使是普通的執行函數,你new或不new都會出現編譯器異常。
new與不new我們要做好以下幾點。
1、首先大家要瞭解new本身幹了什麼,然後看函數建立者的意圖,看函數結構。
2、一個好的程式員在提供某個javascript工具類或公用方法時,應該注釋告訴你的調用者怎麼去使用你提供的公用內容,或者提供Factory 方法。
個人總結:
1、js 對象是什麼 (太難理解了) ?
js對象是屬性的集合
方法(Function) 數組(Array)對象(Object)都是對象
對象都是由函數產生的,只是我們平時看到的這種寫法
var obj = {"a":"aaa","b":"bbb"}
這種其實是一種文法糖,其實等價於 var obj = new Object();obj.a="aaa".obj.b="bbb";
2、如何理解js中的對象
1.抽象的角度:針對現實中的具體事物的一種抽象。
2.資料的角度:將無需的變數集合在一起
JS基礎如何理解對象