我想了解是否可以在子类(.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不起作用
答案 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/