1. 程式人生 > >JS基礎如何理解對象

JS基礎如何理解對象

obj 有一個 函數 實例代碼 內部 是的 工具 對象 幹什麽

這幾天跟幾個同事聊天發現他們對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工具類或公用方法時,應該註釋告訴你的調用者怎麽去使用你提供的公用內容,或者提供工廠方法。

個人總結:
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基礎如何理解對象