javascript的原型

javascript基本對象是:Number, String, Boolean, null, undefined 在ES6中新增了Symbol。這些基本類型存儲在棧中。而Function,Object, Array等數據類型存儲在堆中。引用類型存儲在棧中,保存的是實際內存的地址,指向堆中的數據。

內置對象有哪些:
  • 數據封裝類的有:Object, Array, Number, String, Boolean。

  • 其它對象:Function, Arguments, Math, Date, RegExp。

<b> Object是所有對象的父對象。</b>
<b> javascript有內置對象和原生對象,內置對象是原生對象的一個子集。</b>

內置對象是在引擎初始化階段被創建好的對象。原生對象還包括了一些在運行中動態創建的對象。
原生對象是New后的對象,內置對象不需要New。每個內置對象都是原生對象,一個內置的構造函數是一個內置的對象,也是一個構造函數。
每個對象都會在其內部初始化一個屬性,就是prototype。

修改內置對象的原型:

prototype對象是實現面向對象的一個重要機制。通過prototype可以修改對象的原型。
Array.prototype.forEach = function(fn){ for ( var i = 0; i < this.length; i++ ) { fn( this[i], i, this ); } };
為Array增加一個原型方法forEach,它的功能即為“=”右側的邏輯實現。


var test =["a", "b", "c"]; test.forEach(function(value, index, array){ assert( value, "Is in position " + index + " out of " + (array.length - 1) ); });
代碼輸出:PASS Is in position 0 out of 2
PASS Is in position 1 out of 2
PASS Is in position 2 out of


擴展原型有風險:
Object.prototype.keys = function(){ var keys = []; for ( var i in this ) keys.push( i ); return keys; }; var obj = { a: 1, b: 2, c: 3 }; obj.keys()obj.keys(); //["a", "b", "c", "keys"]
for循環會遍歷對象所有的屬性,包括原型屬性、自定義屬性。

為了判斷一個對象是否包含自定義屬性而不是原型鏈上的屬性, 我們需要使用繼承自Object.prototype的hasOwnProperty方法。 推薦使用for in時,一定使用hasOwnProperty。
注意以下原型使用方法不同:

aa.prototype.bb = XXX(給aa對象原型上增加屬性bb,aa的指針沒有變化。)
aa.prototype = bb(將aa對象原型指向別的對象bb,在內存的指針指向bb,發生了變化)
aa.bb=XXX(bb是對象aa的一個自定義屬性,沒有擴展原型的屬性。)

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容