JS红宝书---高级技巧

1.安全的类型检测
-----(1) 内置的JS类型检测机制并不是完全可靠的。
typeof有时会导致检测的数据类型不是可靠的结果。
instanceof在存在多个全局作用域的情况下无法得到准确的结果。
eg: var isArray = value instanceof Array;
返回TRUE的前提是 value是一个数组,并且该变量要和Array构造函数在同一个全局作用域中;不然若是value在其他的frame框架中定义的数组,上述代码就会返回false。

-----(2) 检测对象是原生对象还是开发人员自定义对象时也会有不可靠情况发生。
可以利用Object原生的toString方法。
如:Object.prototype.toString.call(value)==’[object Array]’
在这里插入图片描述
还可以利用该方法判断某个值是不是原生函数或者正则表达式;
Object.prototype.toString.call(value) ==’[object Function]’
Object.prototype.toString.call(value) ==’[object RegExp]’

但是,该方法不能检测非原生构造函数的构造函数名。所以如果用它检测自定义的构造函数会返回[object Object]

2.作用域安全的构造函数
在自定义构造函数中会有用到this关键字;在创建实例时,会用到new关键字,new的出现使得构造函数内部的this会指向新创建的实例对象。
var person = new Person();
在这里插入图片描述
但是如果没有用new调用构造函数会是什么情况呢?
如:var person = Person()
在这里插入图片描述
上述代码告诉我们,直接调用Person()构造函数也是可以的,但是this会隐射到window上,所以用window.属性名会打印出对的值,用person变量则会报错。如下:
在这里插入图片描述
原因:this对象的晚绑定,this被解析为window对象了。—全局对象意外的被设置属性导致不安全
解决办法:创建一个作用域安全的构造函数。
----if语句中加个判断:this instanceof 构造函数名

function Person(name, age, job){
    if (this instanceof Person){
        this.name = name;
        this.age = age;
        this.job = job;
	} else {
	return new Person(name, age, job);//this不是Person实例时则返回一个实例对象
	}
}
var person1 = Person("XS", 20, "Software Engineer");
alert(window.name); //""
alert(person1.name); //"XS"

var person2 = new Person("Shelby", 4, "Ergonomist");
alert(person2.name); //"Shelby"

3. 惰性载入函数
惰性载入表示函数执行的分支仅会发生一次。代码中有if语句会比没有if语句执行的要慢,当有很多if语句时,如果if语句不必每次执行,那么代码的执行速度要快很多。如createXHR()函数。
实现方式:1.在函数被调用时再处理函数。
2. 在声明函数时指定恰当的函数。

4. 函数绑定
待完善

猜你喜欢

转载自blog.csdn.net/Qian_mos/article/details/85258964