首页 > 解决方案 > 如何在对象上正确运行函数以及如何正确使用 .apply() 在对象上运行方法?

问题描述

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

我得到一个函数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);

我首先应该运行该函数checkOut并将book2其保存到一个变量book2CheckOut中。

这是我正在尝试的:

var book2CheckOut = checkOut.bind(book2)

这应该给我字符串"Oh, the Places You'll Go! is available for check-out."但是我得到了"Oh, the Places You'll Go! is not available for check-out."

然后我应该在book1checkOut 函数上使用 .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! is available for check-out."

标签: javascriptobjectthis

解决方案


我首先应该运行该函数checkOut并将book2其保存到一个变量book2CheckOut中。

这是我正在尝试的:

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)();

...但是如果您不打算保留和重用它,那么创建该功能是没有意义的。

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

这是我正在尝试的:

var book2CheckOut2 = book1.checkOut.apply(book2)

一旦你把第一部分做对了(因为第一个调用翻转了available标志),它就可以正常工作了。请注意,这完全一样checkOut.apply(book2),您只是从属性 onbook1而不是从范围内的标识符获取函数引用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);


推荐阅读