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