uioc
uioc copied to clipboard
支持ES5 setter
我们需要让uioc支持ES5通过Object.defineProperty
定义的setter,一个setter的判断方法比较简单:
var descriptor = Object.getOwnPropertyDescriptor(obj, propertyName);
return descriptor && descriptor.set
一个问题是有可能一个对象同时有foo
这个setter又有setFoo
这个方法,我的建议是都注入一次
同时要支持auto的分析能把setter也找出来,这个逻辑也不难,配合Object.getOwnPropertyDescriptor
就行了
我想周一是不是有可能完成这个功能,包括线下沟通的因为ES6 class默认成员不能枚举导致的for .. in
失效问题
这里是一个已经写完的代替for .. in
的方法
Setter.prototype.findAllSetters = function(config, instance) {
var exclude = config.properties || {};
var deps = [];
if (Object.getPrototypeOf && Object.getOwnPropertyDescriptors) {
var prototype = Object.getPrototypeOf(instance);
while (prototype) {
var keys = Object.getOwnPropertyKeys(keys);
for (var i = 0, len = keys.length; i < len; i++) {
var prop = this.getPropertyFromSetter(keys[i]);
// 有属性,未和属性配置冲突,且组件已注册
prop && !u.hasOwn(exclude, prop) && this.context.hasComponent(prop) && deps.push(prop);
}
prototype = Object.getPrototypeOf(prototype);
}
}
else {
for (var k in instance) {
if (typeof instance[k] === 'function') {
var prop = this.getPropertyFromSetter(k);
// 有属性,未和属性配置冲突,且组件已注册
prop && !u.hasOwn(exclude, prop) && this.context.hasComponent(prop) && deps.push(prop);
}
}
}
};
可以在这个基础上改造加上对Object.getOwnPropertyDesriptor
的使用,并将返回值由字符串改为{proptyName, setterType = 'accessor | method'
应该能解决问题
另外有一个很关键的需要注意的是,因为有getter的存在,我们要尽量避免访问一个属性,因为getter带有逻辑可能产生一些副作用
一个问题是有可能一个对象同时有foo这个setter又有setFoo这个方法,我的建议是都注入一次
我有点纠结:这里的都注入一次,是同一个实例,还是不同的实例?
我有点纠结:这里的都注入一次,是同一个实例,还是不同的实例?
我建议可以暴力点用不同实例,在设计上我们就应该避免这样的情况,当然可以允许在config
上就配置一些什么来告诉你用setXxx
还是setter
,这个可以以后再加强且对auto起不了作用