❤️ Author: 老九
☕️ 个人博客:老九的CSDN博客
🙏 个人名言:不可控之事 乐观面对
😍 系列专栏:
文章目录
- 多态
- symbol
- 迭代器接口
- 实现数组的迭代器方法
- 练习
- Getter/Setter
多态
- 我拿到一个对象,这个对应有我需要的对应的功能。
- 补充:for of可以遍历数组,字符串,集合(Set);这些都是暴露了一个接口,才能使用for of循环的
- typeof类型只有这些是返回特殊的,其他的都是返回object(null也是返回object)
- 多态的体现:Symbol,迭代器接口,数组和字符串都有slice,concat,at,indexof等方法
symbol
- 每一个symbol都是一个唯一的存在,symbol需要一个函数来调用,和创建对象不同的是,symbol()括号里可以写名字,对象不能;Symbol更多的用途就是作为对象的属性名字的
- Symbol不会隐式转换为字符串(a + ’‘ 这样是不行的);它是原型类型,typeof对它的返回是symbol;symbol函数调用时不能加new;symbol自带一个方法是for
<script>
var map = new Map()
function SymbolFor(key){
if(map.has(key)){
return map.get(key)
}else{
var s = Symbol(key)
map.set(key,s)
return s
}
}
</script>
- 通过xxx.description可以查看创建xxx时候传入的字符串
- 设置对象里的变量名字
- 并且symbol只能通过中括号的形式访问
迭代器接口
- Symbol中有一个iterator接口 ,迭代器的基础结构是obj对象里有一个Symbol.iterator的属性,这个属性返回一个对象,这个对象里面有一个next的方法,因为是个闭包,a的值由外层作用域来存储;
- 这个对象自动放在for of中,然后for of自动调用这个对象进行循环遍历
- 迭代器接口是多态的重要体现
实现数组的迭代器方法
- 对象实现了迭代器接口就称iterable,也就是a是可迭代对象
- 调用迭代器接口返回的对象叫iterator,也就是a[Symbol.iterator]是迭代器
<script>
a[Symbol.iterator] = function(){
var len = 0
return {
next : ()=>{
return {
value : this[len++],
done : len > this.length
}
}
}
}
</script>
练习
- 在for(var n of 10)的上面写一段代码,让它能够从1到10输出
<script>
Number.prototype[Symbol.iterator] = function(){
var target = this
var curr = 1
return {
next : {
return{
value : curr++,
done : curr > target + 1
}
}
}
}
for(var n of 10){
console.log(n)
}
</script>
Getter/Setter
- 可以实现属性的可读不可写,并且可以实现不用一直维护对应的属性(size),下面这样写虽然在对象里写的是一个方法,但是读的话是按照属性来读的
- 那么如何给一个已经存在的对象,付给一个属性,这个属性有getter和setter,通过Object.defineProperty(对象名,属性名(字符串),方法)
- 那么如何让if(a == 1 && a = = 2 && a = = 3)能够成立,通过Object.defineProperty方法,将window设置一个a属性添加一个get方法
- 第二种解法:通过设置valueof和toString方法,发现js方法,如果对象和数字进行比较,会调用valueof方法,接着如果valueof方法如果被循环调用的话,js会自动转到toString方法,toString方法,如果在自定义对象中未被覆盖,会用【object xxx】来展示
- 如果是两个对象进行比较,如果同一个对象返回真,否则返回假;如果一个对象和一个原始类型进行比较,对象会自动进行类型转换,类型转换就使用到了valueof和toString的方法
————————————————————————
♥♥♥码字不易,大家的支持就是我坚持下去的动力♥♥♥
版权声明:本文为CSDN博主「亚太地区百大最帅面孔第101名」的原创文章