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

Javascript 我可以使用一个函数来帮助分配和验证作为对象传递的属性吗?,javascript,Javascript,我对JavaScript相当陌生,我想知道是否可以执行以下操作: 我有一个具有4个属性的对象,定义如下: var Thing = new function(){ this.x = 0; this.y = 0; this.width = 0; this.height = 0; } 是否可以定义一个set方法,该方法将对象作为参数,查找匹配的属性并将它们设置为给定值,如果属性不是对象的成员,则引发异常 如果我有一个例子: var thing = new Thing(); 然后 将

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

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

var Thing = new function(){
  this.x = 0;
  this.y = 0;
  this.width = 0;
  this.height = 0;
}
是否可以定义一个set方法,该方法将对象作为参数,查找匹配的属性并将它们设置为给定值,如果属性不是对象的成员,则引发异常

如果我有一个例子:

var thing = new Thing();
然后

将宽度设置为10,但

thing.set({radius: 5});
将抛出异常


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

是的,您只需要在Thing prototype上添加一个
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.prototype

伟大的思考。但是,a)如果目标对象不扩展
object.prototype
,而是宿主对象或具有自己的
hasOwnProperty()
属性,则该怎么办。另外,您的最后一部分,它是有效的语法,只是没有做OP可能期望它做的事情(并且在OP尝试实例化它时会爆炸)。“
var blah=new function(){..}
是无效语法”-是的。它将
blah
设置为匿名函数的一个实例。这可能不是OP想要的。AFAIK一个对象不可能不扩展object.prototype,因为它是所有其他对象扩展的根级别对象。关于重写
hasOwnProperty
,这是一个公平的观点,希望OP不会从重写对象的默认方法开始。感谢您在
Error
上提供的链接,我不知道这些年来我是怎么错过的:P@nnnnnn谢谢你指出这一点,我在我的answer@RobM.
var obj=Object.create(null)
(通常用于一包键/值存储,可能作为对象传递给此函数),使用JavaScript时很难了解您的环境(其他库、第三方脚本很常见)。键也可能来自用户输入。因为您有
var Thing=new function(){…
您的
Thing
已经是匿名函数的一个实例,这意味着
new Thing()
将给出一个错误。非常感谢您提出的改进建议!是的,我对var Thing=
new Thing(){..}
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]; 
    });

};