在Javascript中重新定义Object.defineProperty

时间:2013-11-07 01:22:39

标签: javascript prototype setter

我想了解是否可以在子类(.prototype)中重新定义Object(.prototype)的“definePropery”函数,以便setter不仅可以设置属性的值,还可以执行另外的方法。

我尝试过类似的东西:

Myclass.prototype.defineProperty = function (obj, prop, meth) {
    Object.defineProperty.call(this, obj, prop, {
        get: function () {
            return obj[prop]
        },
        set: function () {
            obj[prop] = n;
            alert("dev")
        }
    })
}

但是id不起作用

1 个答案:

答案 0 :(得分:3)

您似乎对Object.defineProperty的工作方式感到困惑。您只能 defineProperty上调用Object,然后传入要定义其属性的对象。因此,您不需要这种魔力,因为defineProperty根本不存在于您的类的实例中。

var obj = {a:123};

Object.defineProperty(obj, 'foo');
// works fine!

obj.defineProperty('foo');
// TypeError: Object #<Object> has no method 'defineProperty'

但这意味着你可以添加它,没问题:

Myclass.prototype.defineProperty = function (obj, prop, meth) {
    Object.defineProperty(this, prop, {
        get: function () {
            return obj[prop]
        },
        set: function (n) {
            obj[prop] = n;
            alert("dev")
        }
    })
}

请注意以下这一行:

Object.defineProperty(this, prop, {

我们传入我们想要属性的对象(this),以及属性的名称(prop)。然后是setter / getter对象。根本不需要覆盖任何东西。您可以很简单地提供一种方法,允许对象声明它自己的属性。

请参阅此处的工作示例:http://jsfiddle.net/TeZ82/