uioc icon indicating copy to clipboard operation
uioc copied to clipboard

支持ES5 setter

Open otakustay opened this issue 9 years ago • 2 comments

我们需要让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带有逻辑可能产生一些副作用

otakustay avatar May 31 '15 12:05 otakustay

一个问题是有可能一个对象同时有foo这个setter又有setFoo这个方法,我的建议是都注入一次

我有点纠结:这里的都注入一次,是同一个实例,还是不同的实例?

Exodia avatar May 31 '15 12:05 Exodia

我有点纠结:这里的都注入一次,是同一个实例,还是不同的实例?

我建议可以暴力点用不同实例,在设计上我们就应该避免这样的情况,当然可以允许在config上就配置一些什么来告诉你用setXxx还是setter,这个可以以后再加强且对auto起不了作用

otakustay avatar May 31 '15 12:05 otakustay