JS基礎如何理解對象

來源:互聯網
上載者:User

標籤:好的   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基礎如何理解對象

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.