for-in 和 for-of 的区别

for-in

  • index索引为字符串型数字,不能直接进行几何运算
  • 遍历顺序有可能不是按照实际数组的内部顺序
  • 使用for in会遍历数组所有的可枚举属性,包括原型。例如上栗的原型方法method和name属性

所以 for-in 更适合遍历对象,不要使用for in遍历数组。

for-in 遍历的是数组的索引(即键名),而for of遍历的是数组元素值。

for-of 遍历的只是数组内的元素,而不包括数组的原型属性method和索引name

for in 可以遍历到myObject的原型方法method,如果不想遍历原型方法和属性的话,可以在循环内部判断一下,hasOwnPropery方法可以判断某属性是否是该对象的实例属性

同样可以通过ES5的Object.keys(myObject)获取对象的实例属性组成的数组,不包括原型方法和属性

for..of适用遍历数/数组对象/字符串/map/set等拥有迭代器对象的集合.但是不能遍历对象,因为没有迭代器对象.与forEach()不同的是,它可以正确响应break、continue和return语句

通过WeakMap实现私有类变量

主要利用 WeakMap(弱映射)的 “不可迭代键” 特性实现

  • 因为 WeakMap 中 键值对 任何时候都可能被销毁,所以没必要提供迭代其键值对的能力
  • 因为不可迭代,所以也不能在不知道对象引用的情况下从 WeakMap 中取值
  • 之所以限制只能使用 键值对 作为键,是为了保证只有通过键值对的引用才能取得值
  • 如果允许原始值,那就没法区分初始化时使用的字符串字面量和初始化之后的一个相等字符串了

基于上述特性,可以实现真正的私有变量的一种新方式,前提很明确,私有变量会存储在 WeakMap 中,以对象实例为键,以私有成员的字典为值。

通过闭包,维护一个 WeakMap 集合,维护私有变量

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
const User = (() => {
const wm = new WeakMap()

class User {
constructor (id) {
this.idProperty = Symbol('id')
this.setId(id)
}

setPrivate (property, value) {
// 把当前实例当作键值,存储对应对象,存储对应 value
const privateMembers = wm.get(this) || {}
privateMembers[property] = value
wm.set(this, privateMembers)
}

getPrivate (property) {
return wm.get(this)[property]
}

setId (id) {
this.setPrivate(this.idProperty, id)
}

getId () {
return this.getPrivate(this.idProperty)
}
}

return User
})()

浅谈MVVM

MVVM是Model-View-ViewModel的简写。是一种软件架构设计模式,由微软 WPF 和 Silverlight 的架构师 Ken Cooper 和 Ted Peters 开发,是一种简化用户界面的事件驱动编程方式。由 John Gossman(同样也是 WPF 和 Silverlight 的架构师)于2005年在他的博客上发表。即模型-视图-视图模型。

Read More

实现类的继承

类的继承在几年前是重点内容,有n种继承方式各有优劣,es6普及后越来越不重要,那么多种写法有点『回字有四样写法』的意思,如果还想深入理解的去看红宝书即可,我们目前只实现一种最理想的继承方式。

Read More