淺談OOP Javascript [2] -- 構造函數

構造函數函數

上一章咱們講了工廠模式,它的缺點就是沒法識別到底哪一個屬於哪一個的問題。咱們能夠用構造函數來解決這個識別問題。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**
相關文章
相關標籤/搜索