4

如果我能做到这一点,那将非常方便:

var MyObject = function(param1, param2, ... paramN)
{
    this.var1 = stuff;
    this.var2 = moreStuff;
    .
    .
    .
    this.varN = nStuff;

    this.validate = function()
    {
        for(var current in this)
        {
            alert(current);
            //validate all member variables (even this function I suppose)
        }
    };
};

然而,这似乎并没有做我想要的。我意识到循环最终将不得不遍历它的父函数(这也毫不奇怪,不会发生)。

这是不可能的,因为第二个函数中的“this”指的是第二个函数而不是第一个函数吗?还是关键字“this”只是公共成员的声明运算符而不是对外部对象的引用?

我认为以这种方式获得我想要的东西是不可能的,但有没有另一种方法可以实现这种行为?

4

2 回答 2

5

我认为您正在尝试获取成员的价值并以错误的方式进行操作,因此请尝试以下操作:

      var MyObject = function() {
        this.var1 = 'var 1 value';
        this.var2 = 'var 2 value';
        this.varN = 'var n value';
        var self = this;

        this.validate = function() {
          for (var member in self) {
            if (!self.hasOwnProperty(member) || typeof(self[member]) === "function") continue;
            alert(self[member]);
          }
        };
      };

      var m = new MyObject();
      m.validate();

解释一下:循环首先检查属性是否是用户定义的属性,而不是从 Object 对象继承。它还检查该成员不是一个函数(如 validate()),然后警告该成员的值。

在迭代成员时,Douglas Crockford(JS 之父)推荐 hasownproperty 检查作为最佳实践。

希望这可以帮助,

达科

编辑:忘了提self- 我包括这个是因为它是确保你的 this 实际上是你想要的标准的方法。

于 2009-07-12T05:21:57.913 回答
1

你怎么叫validate

以下代码对我来说很好:

var MyObject = function(){
    this.var1 = 'stuff';
    this.var2 = 'moreStuff';
    this.varN = 'Stuff';

    this.validate = function()
    {
        for(var current in this)
        {
            alert(current);
        }
    };
};

var m = new MyObject();
m.validate();
于 2009-07-12T04:16:11.413 回答