ES5

2019-03-12  本文已影响0人  fb941c99409d

严格模式

'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
上一篇 下一篇

猜你喜欢

热点阅读