ES5

作者: fb941c99409d | 来源:发表于2019-03-12 16:53 被阅读0次

    严格模式

    'use strict'; //在全局或函数内第一行书写
    //1.变量必须使用var 定义 否则报错
    str="xxx";
    //2.函数内的this指向不再是window
    function Person(name,age) {
            console.log(this);//undefined
            this.name=name;//相当于设置undefined.name =name 报错
            this.age=age;
     }
    //3.让eval有自己的作用域
     var str =123;
     eval('var str=456;alert(str)');//456
     alert(str);//123
    //4.对象不能用重名属性
    var obj ={
            username:'kobe',
            username:'zs'
     }
     console.log(obj);//运行时没有报错,不过编辑器内有提示 最好别这么写就是了
    //5.不能使用arguments.callee
    function factorial(num){
        if(num<=1) renturn 1;
        return num*arguments.callee(num-1);
    }
    //使用var声明的有名函数  fn不能在外面使用,只能在函数内部使用 ,这里可以解决callee不能使用的问题
    var factorial = function fn(num){
        if(num<=1) renturn 1;
        return num*fn(num-1);
    }
    

    Object扩展

    //ES5给Object扩展了一些静态方法, 常用的2个:
    //1. Object.create(prototype, [descriptors])
     // *prototype 作用: 以指定对象为原型创建新的对象
     // *descriptors 为新的对象指定新的属性, 并对属性进行描述
     //   - value : 指定值
     //   - writable : 标识当前属性值是否是可修改的, 默认为false
     //   - configurable: 标识当前属性是否可以被删除 默认为false
     //   - enumerable: 标识当前属性是否能用for in 枚举 默认为false
     var obj = {name : 'curry', age : 29}
     var obj1 = {};
     obj1 = Object.create(obj, {
        sex : {
          value : '男',
          writable : true,
          configurable:true,
          enumerable:true
        }
     });
    obj1.sex = '女';
    delete obj1.sex;
    console.log(obj1);
    for(var i in obj1){
       console.log(i);
    }
    //2. Object.defineProperties(object, descriptors)
    //  * 作用: 为指定对象定义扩展多个属性
    //    * get :用来获取当前属性值得回调函数
    //    * set :修改当前属性值得触发的回调函数,并且实参即为修改后的值
    //   * 存取器属性:setter,getter一个用来存值,一个用来取值
      var obj2 = {
          firstName : 'curry',
          lastName : 'stephen'
      };
      Object.defineProperties(obj2, {
          fullName : {
              get : function () {
                  return this.firstName + '-' + this.lastName
              },
              set : function (data) {
                  var names = data.split('-');
                  this.firstName = names[0];
                  this.lastName = names[1];
              }
          }
      });
      console.log(obj2.fullName);//curry-stephen
      obj2.fullName = 'kobe-bryant';
      console.log(obj2.fullName);//kobe-bryant
    //3.对象本身的两个方法
    //    * get propertyName(){} 用来得到当前属性值的回调函数
    //    * set propertyName(){} 用来监视当前属性值变化的回调函数
    var obj = {
            firstName : 'kobe',
            lastName : 'bryant',
            get fullName(){
                return this.firstName + ' ' + this.lastName
            },
            set fullName(data){
                var names = data.split(' ');
                this.firstName = names[0];
                this.lastName = names[1];
            }
     };
     console.log(obj.fullName);//kobe bryant
     obj.fullName = 'curry stephen';
     console.log(obj.fullName);//curry stephen
    

    call apply bind

    fn.call(obj,a,b)
    fn.apply(obj,[a,b])
    call 和apply是立即调用函数
    var fn2= fn.bind(obj,a,b)是将函数返回,传参跟call一样, 通常用于指定回调函数的this
    

    相关文章

      网友评论

          本文标题:ES5

          本文链接:https://www.haomeiwen.com/subject/fxfnpqtx.html