javascript - 如何在对象上正确运行函数以及如何正确使用 .apply() 在对象上运行方法?

标签 javascript object this

我无法让它正常运行。我很接近,但事情恰恰与我需要的相反。对此的任何帮助以及对我做错了什么的更多解释将不胜感激。谢谢!!

我得到一个函数 checkOut 和两个对象 book1book2

function checkOut() {
  this.available = !this.available;
  return `"${this.title}" is ${this.available ? '' : 'not '}available for check-out.`;
}

var book1 = {
  title: 'One Fish, Two Fish, Red Fish, Blue Fish',
  author: 'Dr. Seuss',
  available: false,
  checkOut: checkOut
};

var book2 = {
  title: "Oh, the Places You'll Go!",
  author: 'Dr. Seuss',
  available: false
};

var book2CheckOut = checkOut.bind(book2);
console.log(book2CheckOut);

var book2CheckOut2 = book1.checkOut.apply(book2);
console.log(book2CheckOut2);

我首先应该在 book2 上运行函数 checkOut 并将其保存到变量 book2CheckOut

这是我正在尝试的:

var book2CheckOut = checkOut.bind(book2)

这应该给我字符串 "Oh, the Places You'll Go! is available for check-out." 但是我得到 "Oh, the Places You'll Go ! 不可退房。”

然后我应该在 book1 checkOut 函数上使用 .apply() 方法,使用 book2 作为参数运行它。将其保存到变量 book2CheckOut2

这是我正在尝试的:

var book2CheckOut2 = book1.checkOut.apply(book2)

这应该给我字符串 “Oh, the Places You'll Go! is not available for check-out.” 但是给我 “Oh, the Places You'll Go! 可供退房。”

最佳答案

I am first supposed to run the function checkOut on book2 and save it to a variable book2CheckOut.

Here is what I am trying for that:

var book2CheckOut = checkOut.bind(book2)

bind根本不运行该功能。为此,您将使用 apply :

var book2CheckOut = checkOut.apply(book2);

可以为此使用bind,但您想要调用结果,例如:

var checkOutBook2 = checkOut.bind(book2);
var book2CheckOut = checkOutBook2();

var book2CheckOut = checkOut.bind(book2)();

...但是如果您不打算保留和重用它,那么创建函数就没有意义。

Then I am supposed to use the .apply() method on book1 checkOut function, run it using book2 as an argument. Save it to a variable book2CheckOut2.

Here is what I am trying for that:

var book2CheckOut2 = book1.checkOut.apply(book2)

一旦您正确地完成了第一部分(因为第一个调用翻转了 available 标志),它就可以正常工作了。请注意,它与 checkOut.apply(book2) 完全一样,您只是从 book1 上的属性获取函数引用,而不是从范围内标识符 checkout

完整序列:

function checkOut() {
  this.available = !this.available;
  return `"${this.title}" is ${this.available ? '' : 'not '}available for check-out.`;
}

var book1 = {
  title: 'One Fish, Two Fish, Red Fish, Blue Fish',
  author: 'Dr. Seuss',
  available: false,
  checkOut: checkOut
};

var book2 = {
  title: "Oh, the Places You'll Go!",
  author: 'Dr. Seuss',
  available: false
};

var book2CheckOut = checkOut.apply(book2);
console.log(book2CheckOut);

var book2CheckOut2 = book1.checkOut.apply(book2);
console.log(book2CheckOut2);

或者使用我们随后调用的 bind 替代方法:

function checkOut() {
  this.available = !this.available;
  return `"${this.title}" is ${this.available ? '' : 'not '}available for check-out.`;
}

var book1 = {
  title: 'One Fish, Two Fish, Red Fish, Blue Fish',
  author: 'Dr. Seuss',
  available: false,
  checkOut: checkOut
};

var book2 = {
  title: "Oh, the Places You'll Go!",
  author: 'Dr. Seuss',
  available: false
};

var checkOutBook2 = checkOut.bind(book2);
var book2CheckOut = checkOutBook2();
console.log(book2CheckOut);

var book2CheckOut2 = book1.checkOut.apply(book2);
console.log(book2CheckOut2);

关于javascript - 如何在对象上正确运行函数以及如何正确使用 .apply() 在对象上运行方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50863616/

相关文章:

javascript - 简单的 jQuery 代码包含一个我找不到的语法错误

javascript - 为什么 `Object() === new Object()` 等于 `false` ?

javascript - 是否有用于 Javascript 字符串的反向连接运算符?

javascript - 我可以将webdriver v4测试方法链重写为v5(电流光谱/Electron 测试)

javascript - 使用 .submit() 事件处理程序通过 JQuery 循环表单字段

javascript - 为什么我的对象在控制台中的表达方式与通过 Tidy JS 运行时的表达方式不同?

javascript - 是否可以使用 C# 添加 Object 的属性

Javascript 作用域和点击事件

javascript - 如何从 JavaScript 中的匿名事件监听器访问对象属性

C++ : friends of class and "this" pointer