动态访问函数对象属性

Dynamically access function object property

我需要检查多个文本区域的值是否等于此对象的 属性 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 等于名字 如果文本区域的索引等于人的 ID 时才应该匹配.例如,如果我在 textarea1 中输入 "Paul",它应该输出 paul 的工作:但它不应该在 textarea2 中输出它,它应该只输出具有 ID 的人的工作= 2.

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

我确定答案很明显,但我不知道自己做错了什么。

此处演示:https://jsfiddle.net/Lau1989/hxcpstty/

感谢您的帮助

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

您还需要将函数的 return 结果分配给一个变量,以便您可以使用该变量引用新创建的对象。

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,因为您没有使用系统创建的对象 - 您只是创建自己的对象并 returning 它。它仍然可以与 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};
}