Object.defineProperty -> proxy : defineProperty会作用于对象的的属性-get/set , 而Proxy是直接在对象本身上架构一层拦截,颗粒度变大了,由属性到对象。
Function-based API 通过组合函数来编写组件, 引入了新的选项setup(props) 取代了2.0d的data,同样是返回一个对象,并将其暴露给模板。 value() 包装对象,本身是一个响应式数据源,可以追踪对象,并做为依赖,即做到了响应式。 (组合函数中也可以使用生命周期函数***) 打包:对象的属性名不可被压缩,函数是可以的,打包的体积会更小,作为函数,可以被import,这样打包会更加具有弹性,不用的不用被引入,treeshake会把没有用的去除,更加友好。
标准版本:
Object.create(obj) => 如同深拷贝
vue2.0: defineProperty 定义对象的属性,属性中的get和set实现了响应式。
var a = { b: 123, c: 456} Object.defineproperty(a, 'b', {
get: function() {
console.log('get value')
return no },
set: function(newValue) { }
vue3:proxy
var ob = { a: 1, b: 2} var obj = new proxy(ob, { get: function(target, key, reciver) { return target[key]}, set: function(target,key,newValue,reciver) { target[key] = newValue} }) 注意:在使用proxy代理之后,就不能操作原对象了,只能操作被代理的对象。
vue3.0使用proxy的原因是: defineProperty只能监听某个属性,可不能对全部对象进行监听。proxy传递的是整个对象,不用去for in 对象, 可以监听数组,不用去特异的操作了。(.apply(this.arguments))
ts: 数组:let array:number[] = [1,2,3] or let array:Array<number> = [1,2,3] 混合数组类型 tuple let tuple:[string, number] = ['q', 1];
enum: 枚举的值是数字类型 == 手动赋值