javascript——類和模塊
一、類和原型二、類和構造函數
調用構造函數有一個重要的特徵,構造函數的prototype屬性被用作新對象的原型;意味著通過同一個構造函數創建的所有對象都繼承自一個相同的對象,因此它們都是同一個類的成員;
一個編程約定:構造函數首字母都是大寫,普通的函數和方法都是首字母小寫;
1.構造函數和類的標識原型對象是類的唯一標識,當且僅當兩個對象繼承自同一個原型對象時,兩者才是屬於同一個類的實例;兩個構造函數的prototype屬性可能指向同一個原型對象,那麼這兩個構造函數創建的實例是屬於同一個類的;
Range構造函數創建Range對象,可以用instanceof運算符檢測一個對象是否是Range對象: r instanceof Range(如果r繼承自Range.prototype,則返回true)
2.constructor屬性每個JavaScript函數(ES5中的Function.bind()方法返回的函數除外)都自動擁有一個prototype屬性,該屬性的值是一個對象,該對象包含唯一一個不可枚舉屬性constructor,該屬性的值指向這個函數對象本身;
var o = new F;
F.prototype.constructor === F;
o.constructor === F;
構造函數創建的實例對象的constructor指向創建該對象的構造函數;
Range類使用自身的一個新對象重寫預定義的Range.prototype對象,這個新定義的原型對象不含有constructor屬性,我們可以通過不久措施來修正這個問題:顯式的給原型添加一個構造函數;
或是不重寫它,然後依次給原型對象添加方法;
三、JavaScript中Java式的類繼承JavaScript中定義類的步驟可以縮減為一個分三步的演算法,第一步,先定義一個構造函數,並設置初始化新對象的實例屬性;第二步,給構造函數的prototype對象定義實例的方法;第三步,給構造函數定義類欄位和類屬性;
四、類的擴充
對象從其原型繼承屬性,如果創建對象之後原型的屬性發生改變,也會影響到繼承這個原型的所有實例對象。意味著我們可以通過給原型對象添加新方法來擴充JavaScript類。
可以給Object.prototype添加方法,從而使所有的對象都可以調用這些方法,但是在ES5之前,無法將這些新增方法設置為不可枚舉,會被for/in循環遍歷到;Object.defineProperty方法可以安全地擴充Object.prototype,然而並不是所有的宿主環境都可以使用Object.definProperty;
五、類和類型三種檢測任意對象的類的技術:instanceof運算符、constructor屬性、構造函數的名字
1.instanceof運算符左操作數是待檢測類的對象,右操作數是定義類的構造函數,如果o繼承自c.prototype,則o instanceof c為true;
這裡的繼承可以不是直接繼承,間接繼承也是true;
檢測對象的原型鏈上是否存在某個特定的原型對象,可以使用isPrototypeOf方法;
instanceof和isPrototypeOf方法的缺點是,無法通過對象來獲得類名,只能檢測對象是否屬於指定的類名;另外,在多個執行上下文的場景中它是無法正常工作的;
2.constructor屬性因為構造函數是類的公共標識,所以最直接的方法是使用constructor屬性;
不足之處在於:在多個執行上下文的場景中它是無法正常工作的;
並非所有的對象都包含constructor屬性,在每個新創建的函數原型上默認會有constructor屬性,但我們常常會忽略原型上的constructoe屬性;
3.構造函數的名稱六、JavaScript中的面向對象技術1.集合類
2.枚舉類型
3.標準轉換方法
4.比較方法
5.方法借用
6.私有狀態
7.構造函數的重載和工廠方法
七、子類八、ES5中的類1.讓屬性不可枚舉:Object.defineProperty
2.定義不可變的類:
3.封裝對象狀態:getter、setter
4.防止類的擴展:Object.preventExtensions、Object.eal、Object.freeze
5.子類和ES5
6.屬性描述符:Object.getOwnPropertyDescriptor
九、模塊將代碼組織到類中的一個重要原因是,讓代碼更加模塊化;


※Docker下搭建Jenkins構建環境
※php jquery+ajax寫批量刪除
※解決tomcat中反序列化找不到class
※Neo4j 第一篇:在Windows環境中安裝Neo4j
※js實用方法記錄-簡單cookie操作
TAG:達人科技 |