//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