JavaScript prototype的深入理解

2021-09-24 05:10:20 字數 2492 閱讀 3033

所有在js中定義的函式中,都會包含乙個prototype屬性,這個屬性是指向乙個物件的引用,這個物件稱為原型物件,原型物件包含函式例項共享的方法和屬性, 也就是說將函式用作構造函式呼叫(使用new操作符呼叫)的時候,新建立的物件會從原型物件上繼承屬性和方法。

function demo()

}var mydemo = new demo(); //例項化demo函式

console.log(mydemo.a); //undefined

console.log(mydemo.privatefunc); //undefined

在函式內定義的變數和函式如果不對外提供介面,那麼外部將無法訪問到,只能在demo函式內部使用,也就是變為私有變數和私有函式,demo的例項是沒法訪問的。

function demo()

demo.a=0; //靜態變數

demo.staticfunc = function()

console.log(demo.a); //0

console.log(typeof demo.staticfunc); //function

var mydemo = new demo();

console.log(mydemo.a); //undefined

console.log(typeof mydemo.staticfunc); //undefined

a.類的靜態變數/函式通過[類名.類函式名稱]賦值;

b.呼叫時用[類名.類變數/函式名稱()]直接呼叫;

c.類的例項無法呼叫類的靜態變數/函式。

通過this指標可以實現一些例項化之後可以訪問的變數和函式,但是每例項化乙個函式,就產生乙個對原函式的屬性和函式的複製,如下例,例項化之後的物件是可以訪問一開始初始化的值的。但是每例項化乙個會產生乙個複製,互相不影響。這個對於函式來說有很大的問題,因為方法都是在做完全一樣的功能,但是卻又兩份複製,如果乙個函式物件有上千個例項方法, 那麼它的每個例項都要保持乙份上千個方法的複製,這顯然是不科學的,因此,prototype應運而生。

function demo()

}console.log(typeof demo.a); //undefined

console.log(typeof demo.fn); //undefined

var mydemo1 = new demo();

console.log(typeof mydemo1.a); //object

console.log(typeof mydemo1.fn); //function

var mydemo2 = new demo();

mydemo2.a.push(1);

mydemo2.fun = {};

console.log(mydemo2.a); //[1]

console.log(typeof mydemo2.fn); //object

console.log(mydemo1.a); //

console.log(typeof mydemo1.fn); //function

在js中每建立乙個函式就產生乙個prototype函式,預設情況下,prototype會預設獲得乙個constructor函式,這個函式相當於乙個指向原函式的指標。一旦建立了乙個函式,相當於建立了乙個物件,這個物件有prototype屬性,prototype又包含constructor這個屬性。

function person(name)

person.prototype.share=;

person.prototype.printname=function()

var person1=new person('byron');

var person2=new person('frank');

person1.share.push(1);

person2.share.push(2);

console.log(person2.share); //[1,2]

function person(name)

person.prototype.share=;

var person1 = new person('byron');

var person2 = new person('frank');

person1.__proto__.share.push(1);

person2.__proto__.share.push(2);

console.log(person2.share); //[1,2]

person1.share = 'test';

console.log(person1.share) //'test'

console.log(person2.share) //[1,2]

參考:

深入理解C語言 深入理解指標

關於指標,其是c語言的重點,c語言學的好壞,其實就是指標學的好壞。其實指標並不複雜,學習指標,要正確的理解指標。指標也是一種變數,占有記憶體空間,用來儲存記憶體位址 指標就是告訴編譯器,開闢4個位元組的儲存空間 32位系統 無論是幾級指標都是一樣的 p操作記憶體 在指標宣告時,號表示所宣告的變數為指...

mysql 索引深入理解 深入理解MySql的索引

為什麼索引能提高查詢速度 先從 mysql的基本儲存結構說起 mysql的基本儲存結構是頁 記錄都存在頁裡邊 各個資料頁可以組成乙個雙向鍊錶每個資料頁中的記錄又可以組成乙個單向鍊錶 每個資料頁都會為儲存在它裡邊兒的記錄生成乙個頁目錄,在通過主鍵查詢某條記錄的時候可以在頁目錄中使用二分法快速定位到對應...

深入理解C語言 深入理解指標

關於指標,其是c語言的重點,c語言學的好壞,其實就是指標學的好壞。其實指標並不複雜,學習指標,要正確的理解指標。指標也是一種變數,占有記憶體空間,用來儲存記憶體位址 指標就是告訴編譯器,開闢4個位元組的儲存空間 32位系統 無論是幾級指標都是一樣的 p操作記憶體 在指標宣告時,號表示所宣告的變數為指...