作业
    1、写一个函数,可以累加或累乘参数
    image.png
    两个方法都会用到循环,这样就显得冗余,可以将循环运算封装成一个函数(单一功能,可复用)。
    image.png
    2、写两个构造函数,一个构造人,可以选自己的车,一个构造车
    image.png
    3、原型
    prototype是函数的属性,默认是对象,是构造函数构造出的实例的共同祖先,实例共同分享这个对象
    实例自身有的属性,就不会再找构造函数的prototype了
    写构造函数时,一般情况建议实例的动态属性写给this,而固定方法一般放在prototype上,函数是单一功能的(实例属性往往是动态配置的,需要给this赋值,而固定的属性或方法,赋值在实例上,代码就冗余了,写在prototype上更好)
    通过实例只能对构造函数的prototype引用值类型属性进行修改。
    constructor
    consturctor是prototype的属性,指明构造函数。prototype重新赋值后,constructor可以重新指定
    proto
    proto在new构造函数时,this中默认加上的,是保存构造函数原型对象指针的容器。作用是,查找实例本身没有的属性与方法。
    过程如下:
    image.png
    js高级程序中描述到:
    实例与构造函数没有直接联系,实例与构造函数原型对象有直接联系。
    重难点:构造函数prototype重新赋值会不会影响到实例

    1. function Person (){}
    2. Person.prototype.name = 'prototypeOriginalName'
    3. var indivadual = new Person()
    4. Person.prototype = {
    5. name: 'modifiedName'
    6. }
    7. console.log(indivadual.name) => 'prototypeOriginalName'

    此例子印证了,js中引用值在栈内存中保存的是指向堆内存的地址。
    构造函数实例化的时候,实例的proto指向的是堆内存中的对象,和构造函数prototype指向同一地址。之后,构造函数prototype重新赋值后,prototype保存的地址确实改变了,但是不会影响到实例proto对原来原型对象的引用,那个引用还在。
    如果是修改原型对象的话,所有实例的属性查找会受到影响。
    闭包立即执行函数
    window 和 return 实现闭包
    1、通过将函数return 保存在全局实现闭包。

    1. function test (){
    2. var a = 123
    3. function plus(){
    4. a++;
    5. console.log(a)
    6. }
    7. }
    8. var myTest = new test()
    9. myTest.plus()

    2、 配合立即执行函数,直接将函数挂到window上,实现闭包(封装插件常用方法)

    1. ;(function(){}
    2. var a = 10
    3. function plus(){
    4. a++;
    5. console.log(a)
    6. }
    7. window.plus= plus
    8. )()
    9. window.plus()

    引入插件,即可调用相关方法。不用再调用闭包外层函数和声明变量去保存返回的函数了。