JavaScript 學習筆記5

第六章 面向對象的程序設計html

1.屬性類型數組

a.數據屬性app

[[configurable]]:可否刪除函數

[[enumerable]]:可否枚舉this

[[Writable]]:可否修改prototype

[[Value]]:包含這個屬性的數據值設計

修改默認的屬性:Object.defineProperty()指針

b.訪問器屬性htm

[[configurable]]:可否刪除對象

[[enumerable]]:可否枚舉

[[Get]]:在讀取屬性時調用的函數

[[Set]]:在寫入屬性時調用的函數

訪問器屬性不能直接定義,必須調用Object.defineProperty(對象,屬性名,修改內容)

注:可同時定義多個屬性,

讀取屬性的方法:Object.getOwnPropertyDescriptor(對象,屬性名),返回一個對象

2.建立對象

a.工廠模式——用函數來封裝以特定接口建立對象的細節

function createPerson(name,age,job)

{

var o=new Object();

o.age=age;

o.name=name;

o.job=job;

o.sayname=function(){

alert(this.name);

};

return o;

}

b.構造函數模式——用構造函數來穿件特定類型的對象

function Person(name,age,job)

{

this.name=name;

this.age=age;

this.job=job;

this.sayName=function(){

alert(this.name);

};

}

構造函數和普通函數區別:調用方式不一樣,經過new操做符調用

構造函數的問題:每一個方法都要在每一個實例上從新建立一次,可經過把函數定義到構造函數外部來解決

c.原型模式

1).原型對象: 

當建立一個新函數,就會爲該函數建立一個prototype屬性,指向函數的原型對象。全部原型對象自動得到一個constructor屬性,這個屬性包含一個指向prototype所在函數的指針。

Person.prototype.constructor=Person

當調用構造函數建立實例後,實例的內部包含一個[[Prototype]]指針,指向構造函數的原型對象。

鏈接是存在於實例與構造函數的原型對象之間的。

方法:alert(Person.prototype.isPrototypeOf(person1));  //true  ,肯定是不是傳入對象的原型對象

   alert(Object.getPrototypeOf(person1)==person.prototype);//true,能夠方便的取得一個對象的原型

alert(person1.hasOwnProperty.("name"));//true,檢測屬性在原型仍是實例中

只能經過實例訪問原型對象中的值,不能重寫原型對象的值,只能夠覆蓋

 

2).語法——用一個包含全部屬性和方法的對象字面量重寫原型對象

function Person(){}

Person.prototype ={

constructor:Person,//注:由於徹底重寫了默認的prototype對象,constructor屬性再也不指向Person,因此這句有必要

name:"aqssfdgrf",

age:28,

job:"student",

sayName:function(){alert("this.name");}

};

 

3).in與for in

in:經過對象能訪問到給定屬性時返回true,不管在實例仍是原型中

 for-in:返回的是全部可以經過對象訪問的,枚舉的屬性

keys():取得對象上全部可枚舉的實例屬性,接受一個對象做爲參數,返回一個包含全部可枚舉屬性的字符串數組。

Object.getOwnPropertyName():取得全部實例屬性,不管可否枚舉

原型的動態性:

實力與原型間是鬆散連接的關係,實例與原型之間的鏈接只不過是一個指針,重寫原型對象切斷了現有原型與任何以前已經存在的實例之間的聯繫

原型的缺點:因其共享的本質,對包含引用類型值的屬性來講有很大問題

 

d.混合模式——構造函數模式與原型模式結合

構造函數定義實例屬性,原型模式共享方法和共享的屬性

e.動態原型模式

把全部的信息都封裝在構造函數中,經過在構造函數中初始化原型(僅在必要的狀況下),又保持了同時使用構造函數和原型的優勢。

function Person(name,age,job)

{

this.name=name,

this.age=age,

this.job=job,

//方法,這段代碼只有在初次調用構造函數時纔會執行

if(typeof sayName!= "function")

{

Person.prototype.sayName=function(){

alert(this.name);

};

}

}

 

原型模式優勢

  1. 減小內存消耗,系統資源佔用少,全部實例共享同一方法,不會建立多個

  2.  原型對象繼承時,子類在重寫父類原型方法時很方便,能夠很方便 調父類房法,再擴展。

原型模式缺點

  1. 優勢1既是最大的優勢,也一樣帶來一個嚴重問題,若是共享的對象是引用對象(如array)則也會形成多個實例共享同一個array,極可能會相互影響

構造函數缺點

1. 每一次實例化,該對象內部函數都會被建立一遍。

2. 對象繼承並須要在子類中調用父類的方法是不可能的,只能夠覆蓋或者使用。

優勢:

每一個實例的公共對象都是不一樣的,不會相互影響。

 3.實現繼承——依靠原型鏈繼承實際的方法 

a.原型鏈

基本思想:利用原型讓一個引用類型繼承另外一個引用類型的屬性和方法

本質是重寫原型對象,代之以一個新類型的實例

肯定原型和實例的關係:a)instanceof    b)isPrototypeOf()

注:給原型添加方法必定要放在替換原型的語句以後

主要問題:a)來自包含引用類型值的原型   b)建立子類型的實例時,不能向超類型的構造函數中傳遞參數

b.借用構造函數——在子類型函數的內部調用超類型構造函數

call()和apply()——見收藏

優勢:能夠在子類型構造函數中向超類型構造函數傳遞參數

缺點:超類型中原型定義的方法對子類型不可見

c.組合繼承——最經常使用

有關繼承:http://www.cnblogs.com/sanshi/archive/2009/07/08/1519036.html

相關文章
相關標籤/搜索