在 JavaScript 对象中生成通用的 getter 和 setter

8

可以在javascript中创建getter和setter,如下所示:

Object.defineProperty
__define***__

在所有这些情况下,属性的名称是已知的。
是否可能创建一个通用的属性?
我的意思是,我有一个getter和/或setter,它会被调用,而与属性名称无关。
这是可能的吗? 如果可以,怎么做?
顺祝商祺。
注意: 发布问题后,我找到了以下内容。看起来目前不可能,正如第一个答案所述。 JavaScript中是否可能实现动态getter/setter? 监视所有JavaScript对象属性(魔法getter和setter)
5个回答

9

6

JavaScript中有一个非标准函数__noSuchMethod__(),当调用不存在的属性作为函数时会执行该函数。

但我认为JavaScript中还没有你正在寻找的功能(尚未实现)。


谢谢。这正是我也意识到的。看起来我得用旧的函数方式来实现它,直到它被实现。 - ritcoder

1

在当前标准的JavaScript中不可能。


0

我想你应该自己处理这个问题:

if (!object.hasOwnProperty('foo')) {
  // object has a foo property, its value might be undefined

} else if (typeof object.foo != 'undefined') {
  // there is a foo property elsewhere on object's prototye chain with 
  // a value other than undefined

} else {
  // the foo property might exist on the prototype chain with
  // a value of undefined, or might not exist on the chain at all
}

3
我不是很明白。如果我调用obj.foo而foo未定义,代码会如何执行?能否给一个完整的工作示例? - ritcoder
我的意思是其他人说“你不能那样做”,所以我只是要补充一下,在调用它之前,你应该检查obj.foo是否存在。上面是如何做到这一点的工作代码,但它不会告诉你foo是否可调用。在comp.lang.javascript的is Function主题讨论了如何确定某些东西是否可调用。 - RobG
1
好的。我想要做的是实际上捕获对缺失属性的调用并报告它们。这是我正在开发的项目所需的一部分。因此,实际上我不知道将会被调用哪些属性。 - ritcoder

0

我觉得你们可能在寻找这样的东西

function getterSetter()
{
var valA;
this.set=function (propName,val)
{
if(typeof this[propName] =='function' )
{
return false;
}
this[propName]=val;
}
this.get=function (propName,val)
{
if(typeof this[propName] =='function' )
{
return false;
}
return this[propName];
}
}

这里的set和get方法是设置器和获取器。您可以使用以下代码进行验证。

var testObj=new getterSetter();
testObj.set('valA',10);
alert(testObj.get('valA'));

此外,检查要设置/获取的propName不是一个函数。

1
这个想法是为了能够知道何时发出请求来使用不存在的属性或方法,并执行一些自定义函数 - 就像c#中动态工作的方式一样。 - ritcoder

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接