vartest =
"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...