構造函數函數
上一章咱們講了工廠模式,它的缺點就是沒法識別到底哪一個屬於哪一個的問題。咱們能夠用構造函數來解決這個識別問題。this
//構造函數 function Create(a,b) { this.a =a; this.b =b; this.c = function () { return this.a + this.b; }; } var box = new Create('abc',10); alert(box.run()); //返回abc10
咱們參考上一章,發現構造函數和工廠模式的區別:
1.沒有集中實例化
2.沒有返回對象實例
3.直接將屬性和方法賦值給thisspa
1.咱們不須要在構造函數內集中實例化,由於在建立構造函數的同時,後臺會自動建立一個實例化。
2.咱們不須要返回這個對象的實例化,由於它是後臺自動返回的。
3.this就至關於工廠模式的obj.a;指針
解決對象實例歸屬問題code
若是咱們想查看歸屬問題。必需要建立兩個構造函數:對象
function Create(a,b) { this.a =a; this.b =b; this.c = function () { return this.a + this.b; }; } function DeskTop(a,b) { this.a =a; this.b =b; this.c = function () { return this.a + this.b; }; } var box = new Create('abc',10); var box1 = new DeskTop('def',20); alert(box instanceof Object); //這裏要注意:全部的構造函數的對象都是Object. alert(box instanceof Create); //true alert(box1 instanceof Create); //false alert(box1 instanceof DeskTop); //true
構造函數編寫規範:blog
1.構造函數也是函數,可是函數名的第一個字母大寫
2.必須使用new運算符
3.必須使用new + 等同上面的函數名(首字母大寫)例如:var box = new Create();內存
構造函數和普通函數的區別:原型
1.普通函數,首字母無需大寫
2.構造函數,用普通函數調用方式無效it
構造函數內的方法是:基本類型 or 引用類型??
咱們能夠經過例子來看出來究竟是普通類型仍是引用類型:
function Create(a,b) { this.a =a; this.b =b; this.c = function () { return this.a + this.b; }; } var abc = new Create('abc',10); var abc1 = new Create('abc',10);
咱們講兩個傳一樣的值。來比較構造函數內的值就能夠看出究竟是什麼類型。
alert(abc.a == abc1.a); //true //由於傳進去的實參相同,確定是相同的 alert(abc.b == abc1.b); //true //同上 alert(abc.c == abc1.c); //false //這裏看出,他們比較的是引用地址,你們都知道引用地址確定不相等!
基本數據類型的變量存放的是基本類型數據的實際值。而引用數據類型的變量保存對它的引用,即指針。
注:爲何用abc.c而不是abc.c(),由於abc.c是表示的引用地址,而abc.c()是返回這個引用類型的值。
若是你們還沒懂爲何,能夠用一張圖來解釋:
基本類型和引用類型
雖然這個與今天的話題好像沒啥太大關係。可是我感受咱們仍是有必要複習一下基礎知識。
基本類型:
基本類型的比較是值的比較
基本類型是存放在棧內存中的。
基本類型的值是沒法改變的。
引用類型:
引用類型的值是能夠改變的。
引用類型的比較是引用的比較
引用類型是同時存放在棧內存和堆內存中的。
(棧內存中存放的是這個變量名,而堆內存存放的是地址,咱們去調用時會有一個指針指向堆內存的。)
而每次實例化,地址都不相同,因此比較引用類型的地址確定不相同!!!
下一章咱們來說原型。
文章內容有錯誤請及時聯繫做者指正!謝謝!
**Brian Lee**