js 物件導向設計之 Function 普通類

2022-08-16 10:09:14 字數 4100 閱讀 1809

var 

test =

"class01"

;function

class01(privatevalue, publicvalue)

/*統計例項化次數的自執行函式*/

(function

newclass() )();

/*私有變數和私有方法*/

function

privatemethod()

//var

privateval = privatevalue;

/*私有變數儲存介面*/

this

.get =

function

() ;

this

.set =

function

(v) ;

/*例項屬性和例項方法(一般並不會建立例項方法,如果一定要定義例項方法,例項化之後自行新增)*/

this

.public

= publicvalue;

this

.publicmethod =

function

() ;

/*例項方法可以使用類的靜態屬性和方法*/

this

.callclassstaticmethod =

function

() ;

}/* 原型屬性和方法

* 1、類被例項化次數和儲存引用的陣列也可以放在原型中

* 2、每個例項都擁有其他例項的引用和例項化次數

*/class01.prototype.provalue =

'this is class01 prototype value'

;class01.prototype.promethod =

function

() ;

class01.prototype.proarray = [1,

2, 3,

4, 5];

class01.prototype.proobject = ;

/* 靜態屬性和靜態方法

* 靜態屬性是否可用於儲存該類被例項化的次數,通過在類中加入乙個自執行函式即可。

* 也可以在每次例項化的時候執行某種操作

* 1、比如當例項化的數量超過某個值的時候,丟擲錯誤,告訴程式記憶體占用過高。

* 2、可以在類的靜態屬性中,儲存每個例項的引用(肯定造成記憶體洩漏)。

*/class01.staticvalue =

'this is class static value'

;class01.staticmethod =

function

() ;

class01.count = 0;

class01.intances = ;

/* 測試 class01 */

if (test ===

"class01"

) catch

(e)

try

catch

(e)

/*若原型屬性是數值/字串/布林值,例項是沒有手段可以修改。當原型屬性是引用時(數值/物件)時,便可以修改從而在所有的例項物件上會反應出來。*/

console.log(instance01.proarray);

instance01.proarray.push(6);

console.log(instance02.proarray);

console.log(

'類靜態方法'

);instance01.callclassstaticmethod();

instance02.callclassstaticmethod();

try ;}

catch

(e)

try

catch

(e)

try

;class01.call(instance03,

'private value3'

, 'public value3'

);}

catch

(e)

/*以下這種方法,能夠使用 class01 進行函式式"例項化",但是原型都消失了。*/

function

class01_t()

class01_t.prototype.constructor = ;

var

instance04 =

new

class01_t();

class01.call(instance04,

'private value4'

, 'public value4'

);console.log(instance04);

/* 下面這種方法能夠完美模擬 class01 例項化

* 1、以下例子可以看出,在class01_t2中,可以新增例項新的屬性和方法。

* 下面從繼承的角度去看。

* 2、class01_t2中定義的屬性和方法,顯然會被 class01中的覆蓋掉。

* 3、在class01_t2原型上新增方法和屬性,顯然會覆蓋class01的。從而影響所有的由class01建立的例項

* 4、無論如何,class01靜態方法和屬性都在constructor中

* 目前的主題並不是類的繼承,關於function類的例項化和相關知識目前先介紹這麼多。

*/function

class01_t2()

class01_t2.prototype = class01.prototype;

var

instance05 =

new

class01_t2();

console.log(instance05);

instance05.constructor.staticmethod();

console.log(instance05.constructor === class01);

/*建構函式指向 class01;*/

console.log(instance05.prototype);

/*undefined*/

console.log(instance04.prototype);

/*undefined*/

console.log(instance01.prototype);

/*undefined*/

console.log(class01_t2.constructor === class01.constructor);

/*建構函式相等*/

console.log(class01_t2.__proto__ === class01.__proto__);

/*true*/

console.log(instance05.__proto__ === instance01.__proto__);

/*true*/

console.log(instance05.constructor.name);

/*class01*/

/*通過例項的 constructor 可以找到類。可以通過new constructor 從而可以從類例項化。*/

console.log(instance05.__proto__.constructor === class01);

/*true*/

console.log(instance05.constructor === class01);

/*true*/

var

instance06 =

new

instance05.constructor(

'private value6'

, 'public value6'

);console.log(instance06.get());

/* 總結

* 1、只有函式才能被例項化,例項化之後得到的變數是例項並不是函式,或者說是object

* 2、有一種可以不修改 class01 也可以擴充變數或方法(公有或私有)的方式,上述 class01_t2

* 對於這種方式,由相當多的內容可以想象:比如是否可以劫持class01中的公有方法*/}

js學習 物件導向設計

1資料屬性 資料屬性包含乙個資料值的位置,在這個位置可以讀取和寫入值,資料屬性有4個描述其行為的特性 一 configgurable 表示能否通過delete 刪除屬性從而重新定義屬性,能否修改屬性的特性,或者能否把屬性修改為訪問器屬性。他們的特性預設值為true 二 enumerable 表示能否...

js物件導向之this指向

對於前端開發者來說,this是乙個讓人又愛又恨的小妖精。應用得好,專案事半功倍,應用得不好,專案可能漏洞百出。接下來本文就將揭開this的神秘面紗。鄙人第一次鼓足了膽子寫部落格,望路過的大神輕踩 首先強調的一點是,在函式中this指向不是在定義的時候確定的,而是在真正執行此函式時確定的。因為this...

js物件導向之繼承

原型鏈繼承 用法 把例項的父類給子函式的原型 缺點 1 因為修改了obj1.arr後obj2.arr也變了,因為來自原型物件的引用屬性裡所有例項共享的 2 建立子類例項時,無法向父類建構函式傳遞引數 1 function parent 78 function child age 1314 child...