javascript - 对象被 JavaScript 中的后续对象覆盖

标签 javascript regex object inheritance

好吧...相对新手,可能超出了我自己的范围,但就这样了。我创建了一个对象来帮助验证表单。该对象称为“Field”,如下所示:

var Field = {
mini : {
            val : 3,
            err : "Wrong length. Your entry needs to be greater than 2 characters",
            valid : false,
            check : function(target){
                var target = event.target || event.srcElement;
                if (target.value.length < this.mini.val) {
                    this.mini.valid = false;
                    fadeIn("mini",this.mini.err);
                } else {
                    this.mini.valid = true;
                    fadeOut("mini",this.mini.err);
                    return null;
                }
            },
        },

max : {
            val : 5,
            err: "Wrong length. Your entry needs to be less than 30 characters",
            valid : false,              
            check : function(target){
                var target = event.target || event.srcElement;
                if (target.value.length > this.max.val) {
                    this.max.valid = false;
                    fadeIn("max",this.max.err);
                } else {
                    this.max.valid = true;
                    fadeOut("max",this.max.err);
                    return null;
                }
            },
        },

regex : {
            val : /[^a-zA-Z- ]/,
            err : "Letters, hyphens, apostrophes and spaces only please.",
            valid : false,
            check : function(){
                var target = event.target || event.srcElement;
                if (target.value.match(this.regex.val)) {
                    this.regex.valid = false;
                    fadeIn("regex",this.regex.err);
                } else {
                    this.regex.valid = true;
                    fadeOut("regex",this.regex.err);
                    return null;
                }
            },  
        },
hintID : ""
}

我知道这本身有点笨拙,我将寻找进一步对其进行排序的方法。

我创建了该对象的多个实例,如下所示:

 var firstName = Object.create(Field);
    firstName.hintID = fnHint;
    firstName.regex.val = /[^a-zA-Z- ]/;
    firstName.regex.err = "Letters, hyphens, apostrophes and spaces only please.";

 var lastName = Object.create(Field);
    lastName.hintID = lnHint;
    lastName.regex.val = /[^a-zA-Z- ]/;
    lastName.regex.err = "Letters, hyphens, apostrophes and spaces only please.";

 var age = Object.create(Field);
    age.max.val = 3;
    age.max.err = "Wrong length. The age needs to be no more than 3 characters long.";
    age.regex.val = /[^0-9]/;
    age.regex.err = "Numbers only please.";
    age.hintID = agHint;

到目前为止一切顺利。

当我尝试访问单独的对象实例时,就会出现问题,尽管我调用了什么,但我似乎总是得到最后一次出现的结果。例如:

console.log(firstName.regex.err); 

给我在 console.log 调用之前最后声明的 regex.err 实例的值。例如,如果我将该代码放在lastName之后,它会给我lastName.regex.err的值,在age之后,它会给我age.regex.err的值......我可能在这里做了一些愚蠢的事情 - 它一直是知道:-)我已经检查过了,但似乎无法弄清楚。有什么想法吗?

提前致谢。

斯蒂芬

最佳答案

那是因为Object.create() accepts a "prototype" as the first argument 。然后发生的事情是使用相同原型(prototype)创建的所有对象开始共享这些属性,这就是后续调用修改它们的原因。您想要的不是使用 Object.create(),而是 Underscore.js 或 Lo-Dash 中提供的“extend”函数(有关 .extend() 的更多信息可在 this SO question 中找到)。

关于javascript - 对象被 JavaScript 中的后续对象覆盖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26852609/

相关文章:

java - 如何从浏览器区域拖动并存入浏览器区域?

javascript - 如何在 JavaScript 中解析这段 innerHTML?

regex - Google 表格 - 将单元格中的所有数字与文本相加,但不包括 URL

php - 解析包含图像数据的文本文件

javascript - 将单个对象从 JSON 数组映射到新的 JSON 列表。

java - 使用非静态类方法而不引用

javascript - 使用 Flash JavaScript API 控制 YouTube swfobject?

javascript - 使用 Javascript DOM 根据条件选择元素

javascript - 使用javascript的正则表达式负前瞻

powershell - 从 foreach powershell 的返回变量创建一个对象