JavaScript基礎概念之----原型/原型鏈

原型只是一個被稱爲「原型」的空對象屬性。全部的函數都是由Function()構造函數建立的。當建立函數實例時,它老是擁有一個prototype屬性,這是一個空對象。函數

prototype屬性來自Function()構造函數。spa

prototype屬性是JavaScript爲每一個Function()實例建立的一個對象,它經過new關鍵字建立的對象實例連接回建立它們的構造函數。prototype

prototype屬性的值能夠設置爲JavaScript中任何可用的複雜值(對象),JavaScript將忽略任何設置爲原始值的prototype屬性。code

 將構造函數建立的實例連接於構造函數的prototype屬性,意味着 任什麼時候候使用new關鍵字建立對象時,它都會在建立的對象實例和建立對象的構造函數的prototype屬性之間添加一個隱藏的連接。該連接在實例中被稱爲 __proto__對象

var my = new Array(); 
my.constructor === Array
my.constructor.prototype === Array.prototype
my.__proto__ === Array.prototype

Array.prototype.constructor == Array

因爲prototype屬性是一個對象,所以原型鏈或查找中的最後一站是Object.prototype。blog

var my = []; console.log(my.foo); //先在my對象中查找foo //若是沒有找到,再到Array.prototype中查找 //若是沒有找到,再到Object.prototype中查找  //若是也沒有找到,則返回undefined

與做用域鏈同樣,原型鏈在鏈查找時將使用它找到的第一個值。ip

Object.prototype.foo = 1;
Array.prototype.foo = 2; var my = []; console.log(my.foo)//輸出2,在Array.prototype.foo上查找到  my.foo = 3; console.log(my.foo)//輸出3,在my.foo上查找到

使用新對象替換prototype屬性會刪除默認構造函數(constructor)屬性,除非手動指定一個。原型鏈

var Foo = function(){} Foo.prototype = {} var myFoo = new Foo(); //myFoo.constructor !== Foo //myFoo.constructor 爲Object(),而非Foo() var Bar = function(){} var myBar = new Bar() //myBar.constructor === Bar //myBar.constructor 爲Bar() var Hea = function(){} Hea.prototype = { constructor:Hea } var myHea = new Hea() //myHea.constructor === Hea //myHea.constructor 爲Hea()

prototype屬性是動態的。實例老是能從原型得到最新的值,無論什麼時候被實例化、更改、附加。作用域

var Foo = function(){} Foo.prototype.x = 1 var my = new Foo() //my.x 輸出1  Foo.prototype.x = 2 //my.x 輸出2

建立一個實例時,該實例將在實例化時被綁定到「剛完成的」原型。提供一個新對象做爲prototype屬性,不會更新已建立的實例和新原型之間的鏈接。一旦開始建立實例,就不該該用一個新對象來替換對象的原型。原型

var Foo = function(){} Foo.prototype.x = 1;
var my = new Foo(); //my.x 輸出1 //使用新對象覆蓋Foo的原型 Foo.prototype = { x:2 } //my.x 仍是輸出1,my依然引用的是初始化時的原型對象 var bar = new Foo(); //bar.x 輸出2 新對象實例bar引用的是新原型對象
相關文章
相關標籤/搜索