2016-10-10 86 views
-1

我需要检查,如果多个文本域的值等于该对象的属性name动态访问功能对象属性

function make_test(name, job, ID) { 
    test = {}; 
    test.name = name; 
    test.job = job; 
    test.ID = ID; 
    return test; 
} 
    new make_test("Paul", "manager", 1); //doesn't work 
    new make_test("John", "employee", 2); //doesn't work 
    new make_test("Jan", "employee", 2); //works 

这应该只是一个比赛,如果value等于名称如果textarea的索引等于人的ID。举例来说,如果我在textarea1键入“保罗”,它应该输出保罗的工作:但它不应该将它输出在textarea2只应输出具有一个ID = 2

问题的人的工作:我的代码仅适用于最后一个人声明(在这个例子中是Jan)。这就像其他人甚至不存在于对象中,除了最后一个。我怎样才能解决这个问题 ?

我相信答案很明显,但我无法弄清楚我做错了什么。

演示在这里:https://jsfiddle.net/Lau1989/hxcpstty/

感谢您的帮助

+1

测试是全球性的...所以只有最后一个考验将是当前.. 。你需要刷上javascript –

+0

这不是一个构造函数,它是一个返回Object的函数。对象文字已经是“新”了。调用'new'来从构造函数创建一个对象。 – PHPglue

+0

但是,由于您正在进行测试,所以它没有任何意义,但是您不会存储它正在返回的东西。 – epascarello

回答

2

您需要声明test是本地变量,以便你的函数的所有调用不是指完全相同的全局变量。当你不声明你的变量时,它变成了一个隐含的全局变量,它可能导致各种各样的问题。如果您在strict mode中运行您的代码,解释器也会将此标记为您的错误(这通常很有帮助)。

您还需要将函数的返回结果赋值给变量,以便您可以使用该变量引用新创建的对象。

function make_test(name, job, ID) { 
    var test = {}; 
// ^^^ 
    test.name = name; 
    test.job = job; 
    test.ID = ID; 
    return test; 
} 
var o1 = make_test("Paul", "manager", 1); 
var o2 = make_test("John", "employee", 2); 
var o3 = make_test("Jan", "employee", 2); 

console.log(o1.name); // "Paul" 
console.log(o3.job); // "employee" 

也因为你不使用的系统创建的对象不需要new在函数的前面 - 你是刚刚创建自己的对象并将其返回。它仍然可以与new一起使用,但是由于您没有使用系统将使用new创建的对象,所以它很浪费。

如果你希望它是在您使用new并可以继承原型的实际构造函数,那么这样做:

function Make_test(name, job, ID) { 
    this.name = name; 
    this.job = job; 
    this.ID = ID; 
} 

var o1 = new Make_test("Paul", "manager", 1); 
var o2 = new Make_test("John", "employee", 2); 
var o3 = new Make_test("Jan", "employee", 2); 

注意,我这里用一个大写的构造函数的名字,因为它是一种常见的约定为构造函数使用初始帽名称,为常规函数使用初始小写名称。


你也可以只取出声明完全:

function make_test(name, job, ID) { 
    return {name: name, job: job, ID: ID}; 
} 

或者使用ES6语法:

function make_test(name, job, ID) { 
    return {name, job, ID}; 
} 
+0

但是OP使用它的方式,修复这个bug并不会让代码的其余部分运行。 – epascarello

+0

谢谢,我虽然在某个时候需要处理全局变量,但我仍然不知道如何在另一个函数中访问var test = {}属性。简单地在make_test之外声明它并不能解决问题 – Lau

+0

@Lau - 你的问题中的代码并没有真正显示你想要用make_test()创建的对象。在我的例子中,我将它们分配给另一个变量,并且可以通过引用您指定新对象的变量来使用新创建的对象。 – jfriend00