天天看點

《JavaScript啟示錄》筆記——函數原型屬性

//1.JS會為每一個Function()執行個體建立一個對象,無論是否用作構造函數
		//2.建立函數執行個體時,總是擁有一個prototype屬性,該屬性是一個空對象
		var func = function () {};
		console.log(func.prototype);
		console.log(typeof func.prototype);//Object

		//3.預設的prototype屬性是Object()對象
		var func2 = function () {};
		func2.prototype = {};
		console.log(func2.prototype);//{}

		//4.原型鍊将每個執行個體都連結至其構造函數的prototype屬性
		Array.prototype.name = 'name';
		var arr = new Array();
		//通過原型鍊通路原型對象的屬性
		console.log(arr.__proto__.name);//name
		console.log(arr.constructor.prototype.name);//name

		//5.原型鍊的最後是Object.prototype,任何添加到Object.prototype的内容都将出現在for in 循環中
		//6.原型鍊傳回在鍊中找到的第一個比對結果
		//7.用新對象替換prototype屬性會删除預設構造函數的constructor屬性
		var func3 = function func3() {};
		func3.prototype = {};
		var func4 = new func3();
		console.log(func4.constructor === func3);//false
		console.log(func4.constructor);//Object
		//不替換原型屬性時
		var func5 = function func5 () {};
		var func6 = new func5();
		console.log(func6.constructor === func5);//true
		console.log(func6.constructor);//func5{}
		//替換預設prototype屬性時,重新連接配接引用該構造函數屬性
		var func7 = function func7() {};
		func7.prototype = {constructor : func7};
		var func8 = new func7();
		console.log(func8.constructor === func7);//true
		console.log(func8.constructor);//func7{}

		//8.繼承原型屬性的執行個體總是獲得最新值
		var func9 = function func9() {};
		func9.prototype = {num : 1};
		var func10 = new func9();
		console.log(func10.num);//1
		func9.prototype.num = 2;
		console.log(func10.num);//2

		//9.用新對象替換prototype屬性不會更新之前的執行個體
		var func11 = function () {};
		func11.prototype.num = 1;
		var func12 = new func11();
		console.log(func12.num);//1
		func11.prototype = {num : 2};
		var func13 = new func11();
		console.log(func12.num);//1
		console.log(func13.num);//2

		//10.建立繼承鍊
		var func14 = function () {this.str = 'coding'};
		func14.prototype.num = 10;

		var func15 = function () {this.word = 'javscript'};
		//将想要繼承的對象的執行個體作為要繼承對象函數的prototype屬性
		func15.prototype = new func14();
		var func16 = new func15();

		console.log(func16.str,func16.num,func16.word);//coding,10,javascript