赞
踩
Symbol表示独一无二的值,是原始数据类型,不是对象。可以接受一个字符串作为参数,同时symbol创建的值也不能进行相应的加减运算。
1.Symbol的创建
let sy = Symbol(“kk”);
console.log(sy); // Symbol(KK)
typeof(sy); // "symbol"
// 注意的是当两个参数相同时,他们返回的结果时不一致的,因为symbol类型时独一无二的。
let sy1 = Symbol("kk"); sy === sy1; // false
2.Symbol向对象中添加方法
先创建一个对象,接着在对象中定义一个[Symbol(“say”)]方法,这样可以防止方法重名。注意的是定义Symbol类型方法需要使用[]。
情况一:对象中不存在同名方法
let game = {
name: '狼人杀',
[Symbol('say')]: function() {
console.log('发言');
},
[Symbol('zibao')]: function() {
console.log('自爆');
}
}
console.log(game); // {name: "狼人杀", Symbol(say): ƒ, Symbol(zibao): ƒ}
情况二:对象中存在同名方法(需要先定义一个对象来存放Symbol对象)
// 向game对象中添加方法up, down let game = { name: '俄罗斯方块', up: function(){ console.log('上升')}, down: function(){ console.log('下降') } }; // 声明一个对象 let methods = { up: Symbol('up'), down: Symbol('down') }; // 添加方法 game[methods.up] = function() { console.log('methods.up改变形状'); } game[methods.down] = function() { console.log('methods.down快速下降'); } console.log(game); // down: ƒ () // name: "俄罗斯方块" // up: ƒ () // Symbol(down): ƒ () // Symbol(up): ƒ ()
3.调用Symbol向对象中的方法
调用方法:
情况一:(利用getOwnPropertySymbols获取symbol对象,接着按数组格式输出)
const langrensha = Object.getOwnPropertySymbols(game);
console.log(langrensha);
ganme[langrensha[0]]();
情况二:(调用之前存放symbol类型的对象中方法)
gamemethods.down;
game[methods.down]();
对象的Symbol.match属性,指向一个函数。当执行str.match(myObject)时,如果该属性存在,会调用它,返回该方法的返回值。
class MyMatcher {
[Symbol.match] (str){
return "Hello World!".indexOf(str);
}
}
console.log('e'.match(new MyMatcher())); //1
对象的Symbol.replace属性,指向一个方法,当该对象被String.prototype.replace方法调用时,会返回该方法的返回值。
const x = {
[Symbol.replace] (...s) {
return console.log(s);
}
}
'Hello'.replace(x, 'World') // ["Hello", "World"]
对象的Symbol.search属性,指向一个方法,当该对象被String.prototype.search方法调用时,会返回该方法的返回值。
class MySearch {
constructor(value) {
this.value = value;
}
[Symbol.search](str){
return str.includes(this.value);
}
}
console.log("foobar".search(new MySearch("foo"))); //true
对象的Symbol.split属性,指向一个方法,当该对象被String.prototype.split方法调用时返回该方法的返回值。
class MySplit { constructor(value){ this.value = value; } [Symbol.split](str) { let index = str.indexOf(this.value); if(index === -1){ return str; } return [ str.substr(0,index), str.substr(index + this.value.length), ] } } console.log("foobar".split(new MySplit("foo"))); //["","bar"] console.log("foobar".split(new MySplit("bar"))); //["foo",""] console.log("foobar".split(new MySplit("baz"))); //foobar
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。