? ?每個類都有一個prototype靜態屬性,該屬性包含了一個標識該類的一個對象,稱為原型對象。原型對象定義了部分內部屬性,并包含了部分基類屬性,Javascript解釋引擎可知該類的基類;同時基類也有相同的構成,因而又可以推知基類的基類,這樣的鏈條就稱為原型鏈。原型鏈的盡頭是Object的原型對象,其prototype屬性值是null。
## 一、內部屬性
? ? ? ? 1、Prototype屬性:表示該類的父類的原型對象,除了IE之外,都可以用__proto__屬性訪問。每個JS內建類的Pro頭type屬性值是Object,因為都是直接繼承Object。注意與prototype屬性的首字母區別。
? ? ? ? 2、Class屬性:表示類名,是一個字符串。ECMA-262標準第5版規定的所有內建Javascript類的Class屬性值:
? ? ? ? ? ? ? “Arguments”,"Array","Boolean","Date","Error"."Function","JSON","Math","Number","Object"."RegExp"."String"
例如內建類Array的原型對象定義:
~~~
{
Prototype:Object的原型對象,
Class:"Array"
}
~~~
## 二 、__proto__和prototype的區別
? 1、prototype是靜態屬性,__proto__是一個實例屬性,前者是類的原型對象,后者表示原型對象的內部屬性Prototype屬性值。
? 2、每個實例都有一個__proto__屬性,用于引用創建它的構造方法的prototype屬性,即原型對象,如(new Array(“abc”)).__proto__ === Array.prototype返回true
? 3、__proto__有同名的靜態屬性__proto__,也返回原型對象。但是Array.__proto__ == Array.prototype返回FALSE,一般不推薦使用靜態的__proto__。
## 三、檢查原型鏈
? 1、查看對象是否在指定對象的原型鏈中:類名.prototype.isPrototypeOf(obj)-->obj是要檢查的實例對象,若存在原型鏈中則返回TRUE,反之返回FALSE
? 2、查看指定對象是否定義了特定屬性和方法:obj.hasOwnProperty(propName)--->obj是實例對象,但是該方法無法訪問原型鏈中的方法和屬性,可以用原型代替
~~~
var a = new Array();
alert(a.hasOwnProperty("join")); //false
alert(Array.prototype.hasOwnProperty("join")); //true
~~~
在 Array的原型中有join方法,以上是不同方式訪問的結果。使用hasOwnProperty方法時,屬性和方法必須對象本身定義的成員,所以該方法可以過濾原型鏈中繼承的方法和屬性
? 3、檢查指定對象是否定義了特定屬性且可以枚舉:obj.propertyIsEnumerable(propName).自定義的屬性可以枚舉,內置屬性不可以枚舉,如Array的length屬性。改方法不檢查原型鏈。
- 前言
- 一
- 二:變量
- 三:數據運算
- 四:流程控制
- 五:內建的全局函數
- 六:自定義函數
- 七:面向對象編程(OOP)
- 八:靜態成員、靜態類、枚舉、重載和覆蓋
- 九:原型鏈本質論
- 十:ECMAScript 5 增強的對象模型
- 十一:處理字符串---String類和正則表達式
- 十二:數組、多維數組和符合數組(哈希映射)
- 十三:處理日期和時間
- 十四:JavaScript內建類
- 十五:BOM之源---window對象
- 十六:BOM之源---BOM基本應用
- 十七:BOM新成就(1)--客戶端存儲數據(Storage實現)
- 十八:BOM新成就(1)--客戶端存儲數據(Web SQL DataBase實現)
- 十九--HTML5 DOM新標準---處理文檔元信息和管理交互能力
- 二十---XMLHttpRequest和AJAX解決方案