【发布时间】:2012-12-27 00:03:53
【问题描述】:
如您所知,我们可以在 JS 中使用 defineProperty() 定义 getter 和 setter。我在尝试使用 defineProperty() 扩展我的课程时遇到了困难。
这是一个示例代码:
我有一个必须添加到对象的字段数组
fields = ["id", "name", "last_login"]
我还有一个要修改的类
var User = (function(){
// constructor
function User(id, name){
this.id = id
this.name = name
}
return User;
})();
还有一个使用defineProperty()向类添加字段的函数
var define_fields = function (fields){
fields.forEach(function(field_name){
var value = null
Object.defineProperty(User.prototype, field_name, {
get: function(){ return value }
set: function(new_value){
/* some business logic goes here */
value = new_value
}
})
})
};
运行define_fields() 后,我的字段位于User 的实例中
define_fields(fields);
user1 = new User(1, "Thomas")
user2 = new User(2, "John")
但是这些属性的值是相同的
console.log(user2.id, user2.name) // 2, John
console.log(user1.id, user1.name) // 2, John
在这种情况下,有什么方法可以让defineProperty() 正常工作吗?
如果我理解问题出在value 上,它对于
类的每个实例,但我不知道如何修复它。提前致谢
为您解答。
更新: 这种方式抛出“RangeError:超出最大调用堆栈大小”
var define_fields = function (fields){
fields.forEach(function(field_name){
Object.defineProperty(User.prototype, field_name, {
get: function(){ return this[field_name] }
set: function(new_value){
/* some business logic goes here */
this[field_name] = new_value
}
})
})
};
【问题讨论】:
-
一定喜欢 JavaScript。有一刻你以为你掌握了所有可以用它表达的东西的窍门,然后它证明你犯了可怕的错误。
-
在生产中一定会害怕 js。永远不会接受修复不是我写的 js 应用程序的工作!
标签: javascript prototype defineproperty