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

时间:2018-06-14 18:17:09

标签: 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);

我首先应该在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."

然后我应该在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! is available for check-out."

1 个答案:

答案 0 :(得分:1)

  

我首先应该在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 checkOut方法,使用book2作为参数运行它。将其保存为变量book2CheckOut2

     

以下是我正在尝试的内容:

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