ES6中方法定义的新写法

ES6中引入了一种更简便的在对象上定义方法的书写方式。

var tool={

    console(str){

        window.console&&window.console.log(str);

    },

    trim(str){

        return str.replace(/^\s+|\s+$/,"");

    }

};

tool.console("sunshine");

tool.console(tool.trim(" mooshine  "));

这种写法就是直接书写函数就能为对象添加属性方法,函数名将被用作方法名。这里箭头函数不能用作这类方法定义,因为箭头函数是匿名函数。

这个方法定义跟js中提供的getter,setter方法有点类似

var user={

    privateName:"",

    get name(){

        return this.privateName;

    },

    set name(str){

        this.privateName=str.replace(/[-](\w)/,function(str,$1){

            return $1.toUpperCase();

        });

    }

}

user.name="webkit-transform";

console.log(user.name);

这个对于写java的开发人员来说应该不陌生,java中获取对象的属性用get方法,设置对象的属性用set方法。而js中提供的getter,setter方法似乎更强大。只要对象设置了get方法,那么通过“user.name”点操作获取属性值时也是调用定义的getter方法,点操作设置值时,调用的是setter方法。但是要注意,我们给name属性定义了get,set方法,就不能再在对象中定义“name:'webkitUserselect'”这种属性了,如果定义了这个属性,那么会按照书写顺序和get,set发生覆盖,这一点不太相同,在java中我们是先定义name属性,然后定义get,set方法。而js中的get,set方法提供的外部操作仍然是点操作,所以不能再定义name值的属性。

get name(){

    return this.name;

}

上面这种写法也是错误的。因为this.name,仍然会调用那么的get方法,那么就是一个死循环,会导内存溢出而报错的。

而删除属性的get,set方法,可以简单的使用delete操作办到:

delete user.name;

除了简单的方法定义方式外,方法的属性名还可以是表达式:

var sym=Symbol();

var sex="male";

var user={

    privateName:"",

    get [sym](){

        return this.privateName+"...";

    },

    set [sym](str){

        this.privateName=str.replace(/[-](\w)/,function(str,$1){

            return $1.toUpperCase();

        });

    },

    ["sex"+sex](){

        return "你的性别是"+(sex=='male'?"男":"女");

    }

}

user[sym]="webkit-transform";

console.log(user[sym]);

console.log(user.sexmale());

上面的代码中我们使用了方法名的计算表达式,get,set方法同样也支持方法名计算,方法名计算一定要加方括号,这里我们还使用了Symbol标识符,并且可以看到,计算的方法名中的变量同样可以在它的函数中作为变量来使用。记住一点,方法名计算表达式只能使用在对象的属性方法定义中,单独的方法定义中是不能使用方法名计算的,如下面的写法是错误的:

function ["mooshine"](){

    console.log("我的方法名是计算出来的");

}

这种写法会报错的。

还有一个生成器方法的方法名定义简写要注意:

var obj2 = {

  g: function*() {

    var index = 0;

    while(true)

      yield index++;

  }

};

// 同一个方法,简写语法:

var obj2 = { 

  * g() {

    var index = 0;

    while(true)

      yield index++;

  }

};

生成器方法我们后面再讲,生成器方法后面带一个*号,在简写方法是生成器方法时,*号要放在方法的前面。

最后,对于getter,setter方法是ES5中的东西,除了可计算的方法名的写法外,getter,setter是在IE9+的浏览器中都支持的。我们在实际代码中是可以使用getter,setter方法的。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值