原型定义:
    原型是function对象的一个属性,它定义了构造函数制造出的对象的公共祖先。通过该构造函数产生的实例对象,可以继承该原型的属性和方法。原型也是对象。
    例子释义:
    function Person () {};
    var person1 = new Person(); // 实例对象person1
    var person2 = new Person(); // 实例对象person2

    1. 当Person函数创建时,Person.prototype属性就已经产生,且值为空对象:Person.prototype = {}
    2. 实例对象person1 和 实例对象person2是两个类似且独立的对象,他们都有一个公共的祖先prototype,所以他们都会继承prototype的属性和方法:比如Person.prototype.a = 12345,那么person1\person2都有a属性

    原型的特点:

    1. 自己有的属性先找自己,自己没有才去找原型。
    2. 把共有属性放在原型上,会避免代码的冗余。
    3. 通过实例对象无法对原型进行增删改,只能查看
    4. 原型自带的隐式属性:constructor、proto
    5. 谁调用原型上方法,this就指向谁

    原型的属性之一constructor构造器
    是构造函数本身,是原型上的属性,可更改

    实例对象中的隐式属性:proto
    实例对象中的proto属性放的是原型,也就是构造函数的prototype。
    例如上例:
    person1.proto = Person.prototypt指向的空间
    也就说明了,在构造函数构造实例对象的时候,内部隐式声明的this对象里一开始并不是空对象,而是有个proto 属性,该属性指向了构造函数的原型~
    proto的作用:
    他的作用是连接了实例对象与构造函数的原型,也就是当访问一个实例对象上没有的属性时,他会沿着proto属性指向的原型上去查找。

    看题:
    js原型、原型链、call/applay - 图1

    一个原型链的终端的Object
    所有对象的最终都指向Object.prototype(错),对象原型可以用Object.creact(原型)指定。特例:Object.creact(null)

    扩展;
    1. document.write(value)
    这里输出的其实是value.toString()
    2. 0.14 100 = ?

    call/applay:*

    1. 作用:改变this的指向。
    2. 区别:传递的参数格式不同
    3. 扩展理解下bind()

    继承:

    1. 原型链,儿子原型等于父的实例对象,父的原型等于祖父的实例对象,缺点继承了许多多余的属性
    2. call/applay,每次构造一个对象都要执行两个构造函数
    3. 共有原型,儿子的原型等于父的原型……,无法构建自己的原型,一添加都添加:
      Father.prototype.name = ‘wyy’;
      function Father () {}
      function Son () {}
      Son.protutype = Father.prototype;

    4. 圣杯模式:方法还是用共有原型,找一个中间键
      Father.prototype.name = ‘wyy’;
      function Father () {}
      function Son () {}
      function F () {}
      F.prototype = Father.prototype;
      Son.prototype = new F()
      Son.prototype.constructor = Son; // 归位构造函数
      Son.prototype.uber = Father.prototype; // 超类,最终继承者或者用Object.creact():
      Son.prototype = Object.create(new Father())