1 理解JavaScript原型javascript
什麼是原型?java
原型是一個對象,其餘對象能夠經過它實現屬性繼承。git
任何一個對象均可以成爲原型麼?函數
是this
哪些對象有原型.net
全部的對象在默認的狀況下都有一個原型,由於原型自己也是對象,因此每一個原型自身又有一個原型(只有一種例外,默認的對象原型在原型鏈的頂端。)prototype
當咱們已經建立了一個實例對象 ,咱們想要這個實例對象繼承一個已經存在的對象的功能好比說Array,就可使用原型code
函數A的原型屬性(prototype property )是一個對象,當這個函數被用做構造函數來建立實例時,該函數的原型屬性將被做爲原型賦值給全部對象實例(注:即全部實例的原型引用的是函數的原型屬性)htm
有一個原型屬性,這和函數的原型是不同的
b.prototype //[object Object] 函數b的原型屬性對象
b.__proto__ 或者b.construtor.prototype 函數的原型
//建立一個函數b var b = function(){ var one; } //使用b建立一個對象實例c var c = new b(); 1 b的構造函數 b.constructor; // function Function() { [native code]} 2 實例c的構造函數 c.constructor; // 即 b function(){ var one; } b.constructor==Function.constructor; c.constructor==b; 3 b的原型 b.constructor.prototype // function (){} b.__proto__ //function (){} 4 函數b的原型屬性 b.prototype //[object Object] 5 c的對象的原型 c.constructor.prototype //[object Object] c.__proto__ //[object Object] //爲函數b的原型屬性添加一個屬性max b.prototype.max = 3 //實例c也有了一個屬性max c.max //3 上面的例子中,對象實例c的原型和函數的b的原型屬性是同樣的,若是改變b的原型屬性,則對象實例c 的原型也會改變
2 js原型鏈原理看圖說明 太簡潔了,最後一個圖看不懂呀
當你去定義一個prototype的時候,至關於把該實例的__proto__指向一個結構體,那麼這個被指向結構體就稱爲該實例的原型。
var BaseCalculator = function() { this.decimalDigits = 2; }; BaseCalculator.prototype = { add: function(x, y) { return x + y; }, subtract: function(x, y) { return x - y; } }; 建立完上述代碼之後,咱們來開始: var Calculator = function () { //爲每一個實例都聲明一個稅收數字 this.tax = 5; }; Calculator.prototype = new BaseCalculator();
咱們能夠看到Calculator的原型是指向到BaseCalculator的一個實例上,目的是讓Calculator集成它的add(x,y)和subtract(x,y)這2個function,還有一點要說的是,因爲它的原型是BaseCalculator的一個實例,因此無論你建立多少個Calculator對象實例,他們的原型指向的都是同一個實例。
屬性在查找的時候是先查找自身的屬性,若是沒有再查找原型,再沒有,再往上走,一直插到Object的原型上
hasOwnProperty是Object.prototype的一個方法,它但是個好東西,他能判斷一個對象是否包含自定義屬性而不是原型鏈上的屬性,由於hasOwnProperty 是 JavaScript 中惟一一個處理屬性可是不查找原型鏈的函數。