在许多语言中都有都有接口的概念,我在学习 java 语言也是花一段时间才理解接口的作用以及如何使用接口,接口有时候一个规范或者说契约,如果想加入和使用我们就必须要实现或履行接口。接口让我们的程序更加灵活,把一些实现抛出去有使用者来具体实现。在 javascript 这门动态语言中是没有接口概念的。
我们定义一个 Car 类,在构造函数定一个 wheels 的数组,数组包括 wheel 的实例,这里额外说明一个在 java 语言中我们没有的福利,就是在数组元素后面可以随意写逗号,这是让那些 java developer 开发所羡慕的。
在 java 语言我们为了格式好看或避免多些,通常会这样处理数组元素后面的逗号的。
我们这样尝试打印 car ,会提示我们 car 不是一个可以遍历的.
在 javascript 中除了 5 基本数据类型,我们还有 Symbol 这个数据类型
ES6引入了一种新的原始数据类型Symbol,表示独一无二的值。
有时,我们希望重新使用同一个Symbol值,Symbol.for方法可以做到这一点。接受一个字符串作为参数,然后搜索有没有以该参数作为名称的Symbol值。如果有,就返回这个Symbol值,否则就新建并返回一个以该字符串为名称的Symbol值。
我们打印一下,看一看我们通过Symbol.for 定义相同字符串参数的Symbol 是相同的 Symbol 。这样我们就可以利用 Symbol 来定义方法名称来避免命名的冲突。
创建一个 Person 类,在类中定义一个简单方法 play 输出以下。
我们为实现接口效果,我们使用 Symbol.for 来定义一个 Symbol 来作为我们方法名。这样我们方法名就是唯一的了。
我们在回来看我们 Car 类,如果我们想要 Car 是一个可遍历的,在像 java 这样的语言 Car 需要实现一个 Iteratorable 的接口,让他具有可遍历的能力。
在es6中,提供了for...of..循环,Iterator主要提供接口供其消费。Iterator接口其实就是提供一种统一的访问机制,这种访问机制就是for...of,当使用for..of时,该循环就会自动寻找Iterator接口。只要这种数据结构部署了Iterator,具体说就是只要这种数据结构有Symbol.iterator这个属性那么就可以遍历了。
这一次抛出异常与之前有所不同,不是说 Car 不是一个可以遍历的对象,而是说 iterator 方法返回不是一个对象。
那么我们就按要求返回一个对象,再次尝试运行一下。
这是抛出异常又发生变化,说明有一个方法没有定义。
那么我们根据要求在返回的对象中定义一个 next 方法来返回一个对象,再次运行程序。这是程序虽然没有报错,但是就这样运行下去,卡死了。
这是因为我们的 next 方法返回对象中缺少告知程序是否还有值,还是已经没有下一个值的属性,以及具体这个值是什么。我们尝试修改一下代码。
只有 done 为 true 的时候才会停止遍历,如果我们一直赋值为 false 程序就会一直遍历下去。
好吧,经过反复的尝试我想大家对[Symbol.iterator]这个接口用法已经有了比较透彻的了解了吧。
网友评论