2017.03.03
- 计划
- 实际完成
- 完善hM侧边栏组件化
- 将弹出框也封装
- 总结
Cannot call a class as a function at _classCallCheck
babel之class处理Step1: 定义
Class Person{} 被编译为:
function _classCallCheck(instance, Constructor) {
// 检查是否成功创建了一个对象
if (!(instance instanceof Constructor)) {
throw new TypeError("Cannot call a class as a function");
}
}
var Person = function Person() { _classCallCheck(this, Person); };
```
你可能会一头雾水,_classCallCheck是什么?其实很简单,它是为了保证调用的安全性。
比如我们这么调用:
// ok ` new p = new Person();`
是没有问题的,但是直接调用:
// Uncaught TypeError: Cannot call a class as a function Person();
就会报错,这就是_classCallCheck所起的作用。具体原理自己看代码就好了,很好理解。
我们发现,Class关键字会被编译成构造函数,于是我们便可以通过new来实现实例的生成。
Step2:Constructor探秘
我们这次尝试加入constructor,再来看看编译结果:
class Person() { constructor(name) { this.name = name; this.type = 'person' } }
编译结果:
var Person = function Person(name) { _classCallCheck(this, Person); this.type = 'person'; this.name = name; };
看上去棒极了,我们继续探索。
- class Menu {}
若在object中 { menu: Menu },调用会报错。class不能以对象形式调用,虽然会解析成function Menu () {}。
只能通过new Menu() 去调用。
参考:写一个微信小程序自定义公共组件
内调用class 是 App({ LoginPannel })
new app.LoginPannel()- template 使用展开的数据是
data="{{ ...obj }}"
, 若page.data
上没有定义 obj ,在template 内使用wx:for循环输出列表会报错。就算在onLoad事件上setData也是有误的。
VM18377:2 firstRender not the data from Page.data
firstRender not the data from Page.data;firstRender not the data from Page.data Error: firstRender not the data from Page.data