我可以使用一个函数来帮助分配和验证作为对象传递的属性吗

Can I have a function used to help assign and validate properties passed as an object?

本文关键字:验证 对象 属性 分配 帮助 可以使 函数 一个 我可以      更新时间:2023-10-18

我对JavaScript还很陌生,我想知道是否可以执行以下操作:

我有一个具有4个属性的对象,定义如下:

var Thing = new function(){
  this.x = 0;
  this.y = 0;
  this.width = 0;
  this.height = 0;
}

是否可以定义一个set方法,该方法将对象作为参数,找到匹配的属性并将其设置为给定值,如果该属性不是对象的成员,则抛出异常。

所以,如果我有一个例子:

var thing = new Thing();

然后

thing.set({width: 10}); 

将宽度设置为10,但

thing.set({radius: 5});

会引发异常。

这可能吗?如果是,我该如何实现这一点?

是的,您只需要在Thing原型上添加一个set方法:

Thing.prototype.set = function(obj){
   for(var attr in obj){
       // make sure attribute is not inherited from prototype chain
       if(obj.hasOwnProperty(attr)){
           // ensure that Thing has this attribute
           if(this.hasOwnProperty(attr)){
              this[attr] = obj[attr];
           } else {
              throw new Error("Property doesn't exist");
           }
       }
   }
}

此外,var blah = new function(){..}应该只是var blah = function(){..}

您的第一个块有点奇怪,不应该在那里使用new。此外,如果要使用分号,则应该保持一致,并将分号放在函数的右大括号后面,因为它是一个函数表达式。

至于你的实际问题,这确实是可能的。您可以扩展具有此功能的子类。。。

Subclass.prototype.set = function(properties) {
    Object.keys(properties).forEach(function(key) {
        if ( ! Object.hasOwnProperty.call(this, key)) {
            throw Error("The target object doesn't have the key '" + key + "' defined.");
        }
        this[key] = properties[key]; 
    });
};

然后你可以让Thing的原型指向它。如果Thing是你唯一想使用它的东西,只需将它分配给Thing.prototype