js高级程序设计学习-高级技巧

244 阅读2分钟

导言

本文,我们来总结一下 javaScript 中常用到的一些高级技巧

高级函数

函数是 js 中最有意思的部分之一。 此外,由于所有函数都是对象, 所以使用函数指针非常简单。

安全的类型检测

这个我想都知道
在任何值上调用 Object.toString 返回一个 [object NativeConstructorName]

function isArray(target) {
    return Object.prototype.toString.call(target).slice(8,-1) === 'Array';
}

作用域安全的构造函数

function Person(name , age , job) {
    this.name = name;
    this.age = age;
    this.job = job;
}

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);
    }
}

var person = Person('hw',12,'Engineer');

函数柯里化

与函数绑定紧密相关的主题是 函数柯里化, 它用于创建已经设置好了一个或者多个参数的函数。

sum(1)(2)(3) = 6;

function sum(x , y ,z) {
    return x + y + z;
}

function curry(fn) {
    let args = Array.from(arguments).slice(1);
    return function() {
        args = args.concat(Array.from(arguments));
        if(args.length === fn.length) {
            return fn.apply(this,args);
        } else {
            return arguments.callee;
        }
    }
}

let curry_sum = curry(sum);
curry_sum(1)(2)(3); // 6

防篡改对象

js 共享的本质一直是开发人员是开发人员的心头的问题。因为任何对象都可以被在同一环境中运行的代码修改。开发人员很可能会意外地修改别人的代码
ES5致力于解决这个问题,可以让开发人员定义防篡改对象(tamper-proof-object)
不过注意,一旦把对象定义为防篡改,就无法撤销了。

不可扩展对象

默认情况下,所有对象都是可以扩展的。也就是说,任何时候都可以向对象中添加属性和方法。

var person = { name :'hw' };
person.age = 18;

现在,使用 Object.preventExtensions(person) 方法可以改变这个行为,让你不能再给对象添加属性和方法。

var person = { name : 'hw' };
Object.preventExtensions(person);
person.age = 19;
console.log(person.age); // undefined

在调用了 Object.preventExtensions()方法后, 就不能给 person 对象添加新属性和方法了。
在非严格模式下 , 给对象添加新成员会导致失败,因此 person.age 将是 undefined。 而在严格模式下,尝试给不扩展的对象添加新成员会导致抛出错误

可以使用Object.isExtensible()方法还可以确定对象是否可以扩展

var person = { name : 'hw' };
console.log(Object.isExtensible(person)); // true
Object.preventExtensions(person);
console.log(Object.isExtensible(person))

密封的对象

ES5为对象定义的第二个保护级别是密封对象(sealed object)。
密封对象不可扩展,而且不能删除属性和方法
要密封对象,可以使用 Object.seal()方法

var person = { name : 'hw' };
Object.seal(person);
person.age = 18;
console.log(person.age); // undefined; 不可扩展

delete person.name;
console.log(person.name); // 'hw'  不能删除属性和方法

冻结的对象

最严格的防篡改级别是 冻结对象(frozen object)。 冻结的对象即不可扩展,又是密封的,而且对象数据属性的 [[writable]] 特性会被设置为 false。
这也就意味着 原有的属性不可写

var person = { name : 'hw' };
Object.freeze(person);
person.age = 29;
console.log(person.age); // undefined;

delete person.name;
console.log(person.name); // 'hw'

person.name = 'zs'; // 不可写
console.log(person.name); 'hw'