摘要:構造函數上一章我們講了工廠模式,它的缺點就是無法識別到底哪個屬于哪個的問題。我們可以用構造函數來解決這個識別問題。來比較構造函數內的值就可以看出到底是什么類型。
構造函數
上一章我們講了工廠模式,它的缺點就是無法識別到底哪個屬于哪個的問題。我們可以用構造函數來解決這個識別問題。
//構造函數 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.直接將屬性和方法賦值給this
1.我們不需要在構造函數內集中實例化,因為在創建構造函數的同時,后臺會自動創建一個實例化。
2.我們不需要返回這個對象的實例化,因為它是后臺自動返回的。
3.this就相當于工廠模式的obj.a;
解決對象實例歸屬問題
如果我們想查看歸屬問題。必須要創建兩個構造函數:
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
構造函數編寫規范:
1.構造函數也是函數,但是函數名的第一個字母大寫
2.必須使用new運算符
3.必須使用new + 等同上面的函數名(首字母大寫)例如:var box = new Create();
構造函數和普通函數的區別:
1.普通函數,首字母無需大寫
2.構造函數,用普通函數調用方式無效
構造函數內的方法是:基本類型 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**
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/81067.html
摘要:構造函數通過原型繼承了構造函數和原型,這就形成了一個鏈條,通俗的講就是原型鏈繼承。而且方法只能冒充構造函數里面的屬性和方法而無法冒充原型對象里面的屬性和方法還有最大的問題就是重復使用。 前言: 寫到這里,差不多就把OOP完結了,寫了幾篇OOP的文章,但是只是略懂皮毛,可能深入的OOP還有很多,但是我感覺寫到這里也算是差不多完結了。 繼承 繼承是面向對象比較核心的概念,其他語言可能實現...
摘要:上一章我們談了構造函數,他的唯一特點就是比較了地址不相同,因為大家知道引用類型是比較的引用。也就是說不用在構造函數中定義對象實例,而是直接將這些添加到原型當中。如果構造函數實例里面沒有,就去原型里面查找,如果有就立即返回。 上一章我們談了構造函數,他的唯一特點就是比較了地址不相同,因為大家知道引用類型是比較的引用。我們來談談原型。 原型 我們每創建一個函數都有一個原型(prototyp...
摘要:工廠模式優點集中實例化,可以傳參等缺點分不清屬于哪個對象我們先來談談優點,看例子集中實例化返回實例化對象返回返回不難看出,工廠模式比上面的例子減少了很多代碼。 ECMAscript開發的兩種模式:1.過程化 2.OOP(面向對象) 面向對象的語言有一個標志,那就是類的概念,而通過類可以創建任意多個具有相同屬性的方法的對象。但是ECMAscript中沒有類的概念! 又談作用域 首先...
摘要:面向對象面向對象編程的全稱是,簡稱,面向對象編程是用抽象方式創建基于現實世界模型的一種編程模式。面向對象編程的三個主要特征是封裝繼承多態。 面向對象 面向對象編程的全稱是Object Oriented Programming,簡稱OOP,面向對象編程是用抽象方式創建基于現實世界模型的一種編程模式。面向對象編程可以看做是使用一系列對象相互協作的軟件設計,面向對象程序設計的目的是在編程中促...
摘要:注意這里跟原型鏈繼承有個比較明顯的區別是并沒有使用繼承而是在子類里面執行父類的構造函數相當于把父類的代碼復制到子類里面執行一遍這樣做的另一個好處就是可以給父類傳參。 Javascript繼承 學過后端語言的同學對繼承并不陌生,但是對JS繼承少許還是有些困惑,不要試圖問我是如果知道的,其實javascript繼承主要是基于原型prototype實現的。 其實當你真正了解了原型鏈時候,再看...
閱讀 3450·2019-08-30 10:54
閱讀 3147·2019-08-29 16:38
閱讀 2165·2019-08-26 14:06
閱讀 1511·2019-08-23 15:39
閱讀 3033·2019-08-23 15:37
閱讀 2882·2019-08-23 13:50
閱讀 3189·2019-08-22 17:14
閱讀 2374·2019-08-22 15:44