动态访问函数对象属性

时间:2016-10-10 23:46:36

标签: javascript function object textarea selectors-api

我需要检查多个textareas的值是否等于此对象的属性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,则该匹配应该只是匹配。例如,如果我输入" Paul"在textarea1中,它应该输出paul的工作:但它不应该在textarea2中输出它,而ID只应该输出IF DEFINED DOTNET_PATH goto DotNetPathDefined SET DOTNET_PATH=%ProgramFiles(x86)%\dotnet\dotnet.exe :DotNetPathDefined = 2的人的工作。

问题:我的代码仅适用于最后声明的人(本例中为Jan)。它就像其他人甚至不存在于对象中,除了最后一个。我该如何解决这个问题?

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

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

感谢您的帮助

1 个答案:

答案 0 :(得分: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};
}