javascript - 如何在对象上正确运行函数以及如何正确使用 .apply() 在对象上运行方法?
问题描述
我无法让它正常运行。我很亲密,但事情与我需要的正好相反。对此的任何帮助以及对我做错的更多解释将不胜感激。谢谢!!
我得到一个函数checkOut
和两个对象book1
和book2
。
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."
解决方案
我首先应该运行该函数
checkOut
并将book2
其保存到一个变量book2CheckOut
中。这是我正在尝试的:
var book2CheckOut = checkOut.bind(book2)
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)
,您只是从属性 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);
推荐阅读
- nlog - 过滤时根据包含的子字符串记录到不同的文件
- javascript - 为什么子弹会走错路?
- python - 根据 Kivy 中的返回值设置默认屏幕
- php - 用于签署推送通知令牌的 Apple 签名密钥的 x、y 和曲线参数是什么?
- java - 在 RecyclerView 中显示 SQLite DB 数组列表不断崩溃
- typescript - 使用 TypeScript 的捆绑器
- ios - 通过蜂窝连接连接时出现 SSL 错误
- python - 如何在 python 中读取文件并将其内容保存到二维数组?
- c++ - 条件运算符从其参数的副本返回值
- sql-server - 如何使用 SSIS 每周导入文件?