【问题标题】:Dynamically access function object property动态访问函数对象属性
【发布时间】:2016-10-10 23:46:36
【问题描述】:

我需要检查多个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 等于姓名 并且 文本区域的索引等于人员的 ID 时,它才应该是匹配的。例如,如果我在 textarea1 中输入“Paul”,它应该输出 paul 的工作:但它不应该在 textarea2 中输出它,这应该只输出具有 ID = 2 的人的工作。

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

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

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

感谢您的帮助

【问题讨论】:

  • 测试是全球性的......所以只有最后一个测试是最新的......你需要重新学习javascript
  • 那不是 Costructor,它是一个返回 Object 的函数。对象文字已经是new。调用new 从构造函数创建对象。
  • 但它是零意义的,因为你正在做测试,但你没有存储它返回的任何东西......

标签: javascript function object textarea selectors-api


【解决方案1】:

您需要将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};
}

【讨论】:

  • 但是 OP 使用它的方式,修复 bug 不会让其余代码运行。
  • 谢谢,虽然在某些时候它与全局变量有关,但我仍然不知道如何在另一个函数中访问 var test = {} 属性。简单地在 make_test 之外声明它并不能解决问题
  • @Lau - 您问题中的代码并没有真正显示您要对make_test() 创建的对象执行什么操作。在我的示例中,我将它们分配给另一个变量,您可以通过引用您将新对象分配给的变量来​​使用新创建的对象。
  • 我试图在function suggest(index) 的布尔值中使用它们来通过它们的名字访问它们(就像我试图用test.name 一样)而不是只用一个,使用o1 。姓名。感谢您指出这一点,我将编辑我的问题以添加这部分代码。
  • @Lau - 我已经回答了您在原始问题中提出的内容,如果您继续向同一个问题添加更多问题,它在堆栈溢出时效果不佳。如果您仍然对其他事情感到困惑,那么也许您应该发布一个新问题。从您的 jsFiddle 中不清楚您要在 suggest() 函数中完成什么。您可以在一个新问题中解释这一点。
猜你喜欢
  • 2011-08-10
  • 2013-07-21
  • 1970-01-01
  • 2011-06-15
  • 2019-01-29
  • 2019-04-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多