js setter & getter

2018-08-19  本文已影响0人  炒鸡大馒头

在mvvm框架中,数据双向绑定的底层实现中会用到setter和getter,javascript的中的setter和getter可以实现:

主要有如下4种实现方式:

var obj = {
    a: 1,
    get b() {
        return this.a;
    },
    set b(v) {
        this.a = v;
    }
};
console.log(obj.b);
obj.b = 2;
console.log(obj.b);
var proto = {a : 1};
var obj = Object.create(proto, {
    b: {
        get: function () {
            return this.a;
        },
        set: function (v) {
            this.a = v;
        }
    }
});
console.log(obj.b);
obj.b = 2;
console.log(obj.b);
var obj = { a: 1 };
obj.__defineGetter__("b", function () {
    return this.a;
});
obj.__defineSetter__("b", function (v) {
    this.a = v;
})
console.log(obj.b);
obj.b = 2;
console.log(obj.b);
var obj = { a: 1 }
Object.defineProperty(obj, "b", {
    get: function () {
        return this.a;
    },
    set: function (v) {
        this.a = v;
    }
});
console.log(obj.b);
obj.b = 2;
console.log(obj.b);

以上示例中

在某些业务场景中,用户在文本框输入之后,会触发oninput方法进行校验,标红等。但是如果使用js为input赋值却无法触发这些方法,那么就可以使用setter,getter来实现。

<input id="xf" type="text" name="tt" value="1" />
<script type="text/javascript">
var inputProto = HTMLInputElement.prototype;
Object.defineProperty(inputProto, "value", {
    set: function (value) {
        var newValue = arguments.length ? value : this.value;
        var node = this.attributes.value;
        if (!node || newValue !== node.value) {
            var event = document.createEvent("Event");
            event.initEvent("input", true, true);
            this.setAttribute("value", newValue);
            this.style.color = 'red'
            if (document.documentElement.contains(this)) {
                this.dispatchEvent(event);
            }
        }
    }
});
xf.oninput = function () {
    console.log("fire event oninput!");
}
xf.value = 2;
</script>

上诉代码,当使用js修改input元素的value值时,触发set方法,使input的文字变成红色,并且触发oninput事件。

注意

上诉代码只在chrome下测试有效,其他浏览器的兼容方式可自行搜索。

上一篇 下一篇

猜你喜欢

热点阅读