Javascript 我可以使用一个函数来帮助分配和验证作为对象传递的属性吗?
我对JavaScript相当陌生,我想知道是否可以执行以下操作: 我有一个具有4个属性的对象,定义如下: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(); 然后 将
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];
});
};