方式一:
如果是变量的话,就是找作用域链,如果是实例的话就是找原型链的
通过这样的话就创建了两个东西,但是这两个东西之间是没有关系的,最后一个语句是会报错的,因为和父亲还没有关系的
如果想要用父亲的方法的话,就要变成是这个父亲的实例才行。然后就可以直接在原型中查找这个方法了
也就是关键就是这句话了
==也就是因为默认就是Object的实例,所以可以用toString的方法,同理的如果我要用父亲的方法的话,我就要变成是父亲的实例即可了
===添加了这个语句的话,就可以实现使用父亲的方法的了
这个代码也就是先是变成了父亲的实例对象之后。再在自身的原型上面添加了方法的,也就是说既可以使用父亲的方法也可以使用自己在后面定义的方法了
这个就是完成了上面红色框之后的图了
下面这个就是完整的结构图:
2、组合继承:
发现在上面代码中出现了一个问题,通过一个语句来判断
打印出来的应该是Sub,才对的,但是这里打印出来的是supper
===这个是因为我们把sub变成了是Supper的实例对象了,所以直击打印constructor的时候,也就是把supper的原型打印出来,也就是打印出来了supper了
下面是我们把这个sub直接打印出来的结果:
也就是Object的constructor直接指向了下面的Supper了
(这样就是不对的了)
这样是不对的,要让sub的constructor指向的是Sub才是对的
通过代码:
3、借用构造函数继承
同这个代码其实就好像是把上面的构造person的函数代码移动到这里来了(就相当于是注释里面的代码一样了)
但是这里是不存在继承的,只是简化了一下代码而已了
3、组合继承:
通过这个代码:
就是为了可以看到person的原型方法setName
(这句话是真正的产生了继承的,然后看到父亲的方法了)
通过这样的代码既可以拿到person里面的属性还可以拿到person的方法了
**闭包终极面试题:
(这个题目的难点就是fun函数的名字有两个都i是相同,有时候都不知道现在是调用到了哪个函数了
然后内部的函数还调用了外部的函数)==
==有闭包的,导致这个闭包的原因是因为外面的n属性
这里执行了18行之后,返回的是一个对象
(这个题目的关键就是有没有新建一个新的闭包,如果没有赋值的话,就一直都是原来的闭包,也就是一直输出同样的东西,直到下一次的赋值操作,新建新的闭包了
这个输出的其实就是闭包里面的n,因为o和n的位置是一样的
比如这里就是一直用同样的闭包的,所以输出的值是一样的
四、线程机制和事件机制
1、进程与线程