我试图使用map
找出单线代码。
这是一个简单的设置。
function Cat(name) {
this.name = name;
// FYI: using __proto__ is discouraged. thanks @KarelG
this.__proto__.mew = function () {
console.log(this.name + " mews");
};
}
var cats = [
new Cat('MB'),
new Cat('503')
];
然后,我可以使用map()
在猫中调用mew
方法。
cats.map(function (cat) {
cat.mew();
});
// MB mews
// 503 mews
原型上的 call()
也有效。
cats.map(function (cat) {
Cat.prototype.mew.call(cat);
});
// MB mews
// 503 mews
这是我的最后一行,但它会发出错误,我无法理解原因:
cats.map(Cat.prototype.mew.call);
// Uncaught TypeError: undefined is not a function
// at Array.map (<anonymous>)
检查typeof Cat.prototype.mew.call
说它是function
并且map()
的参数应该是一个函数。
有人能解释为什么它不起作用吗? 我错过了什么以及在哪里纠正?
答案 0 :(得分:6)
有人可以解释为什么它不起作用?我错过了什么,在哪里 正确的吗?
错误消息说
VM1100:15 Uncaught TypeError:undefined不是函数
这意味着它希望在mew
的上下文中调用undefined
方法。
您需要将上下文绑定为
cats.map( Cat.prototype.mew.call.bind( new Cat().mew ) );
<强>演示强>
function Cat(name) {
this.name = name;
this.__proto__.mew = function () {
console.log(this.name + " mews");
};
}
var cats = [
new Cat('MB'),
new Cat('503')
];
cats.map( Cat.prototype.mew.call.bind( new Cat().mew ) );
或者@PatrickRoberts建议,您可以使用
cats.map(Function.call.bind(Cat.prototype.mew))
避免不必要地创建Cat
cats.map(function (cat) { Cat.prototype.mew.call(cat); });
表达式,为什么Cat.prototype.mew.call
具有正确的上下文?
根据spec
如果提供了thisArg参数,它将用作此值 每次调用callbackfn。如果未提供,则未定义 反而用了。
所以,除非你传递像
这样的上下文cats.map( Cat.prototype.mew.call, new Cat().mew );
它将是undefined
。