掘友等级
获得徽章 0
new的功能其实就是创建对象类型的实例
有一点需要注意的就是如果new 后面的构造函数返回的是对象或函数的话,则new 返回的则为构造函数返回的这个对象或函数,否则才是新创建对象类型的实例返回
关于bind的几个特别需要注意的点1、bind的返回的函数能够用作构造函数,也就是说可以使用new 操作符来创建对象,但是bind时提供的this值会失效,但传入的参数依旧生效
2、bind的constructor无需特别考虑
3、bind返回的函数没有prototype
4、只有函数才能调用bind
Object.create 的模拟实现原来这么简单
Object.create = function( o ) {
function f(){}
f.prototype = o;
return new f;
};
call原理其实就是给指定对象新增属性,属性值为当前执行的函数,执行完函数后删除新增属性
实现当中需要注意的几点:
1、新增属性保证与之前对象上的属性不冲突,不存在覆盖的情况
2、考虑传入的参数,这个函数要被调用且有返回值
3、如果第一个参数是null或undefined的,则当前指向为window,如果第一个参数是基本数据类型的话,则指向的是此基本数据对应对应的包装类型
大家有没有发现apply使用的细节点?
1、apply第二个参数如果基本类型会报错
2、apply第二个参数它可以是类数组
总结一句话就是apply的第二个参数必须是数组或类数组


有图有真相
“在进入执行上下文时,首先会处理函数声明,其次会处理变量声明,如果如果变量名称跟已经声明的形式参数或函数相同,则变量声明不会干扰已经存在的这类属性。”
大家是这么说的,我怎么觉得我那样更容易理解?是这样么?求答案
分析一下图片中题目输出的为什么会是这个结果?
这段代码里一共有两个对象,我们分别给这两个对象取个名字:
objA = { n: 1 };
objB = { n: 2 };
1、在执行 a.x = a = { n: 2 }前a和b都指向objA;
2、点运算符优先级高,所以a.x=a={n:2}这句话先执行a.x,这里a指向objA,也就相当于把原先的代码替换成了objA.x = a =objB;
3、然后执行赋值运算,从右往左,所以执行a = objB,a是个变量,它现在指向objB;
4、再往左,执行赋值运算,objA.x = a,相当于objA.x = objB。此时objA被修改;
所以b始终指向objA,而a在执行a = { n: 2 }时指向了objB
动态创建script如果要保证顺序执行的话,需要设置动态创建的script的async为false
动态创建script如果要保证顺序执行的话,需要设置动态创建的script的async为false
下一页