我从Mongoose中获得了一些意想不到的行为:当我在映射函数中使用Model.create作为参数时,我收到错误
variables.map(Variable.create);
TypeError: object is not a function
at Array.forEach (native)
at Array.map (native)
但是当我在一个匿名函数中包装Model.create时,我没有收到错误:
variables.map(function(variable) {
return Variable.create(variable);
});
是什么给出了?
使用"node": "0.10.33"
和"mongoose": "3.8.25"
答案 0 :(得分:0)
啊,你偶然发现了Javascript对象及其方法/属性的世界。
简短的回答是内部方法create
使用Variable
中的其他对象属性/方法。当您将Variable.create
传递给映射函数时,它会直接传递对create
的引用,因此原型链现在已被破坏。如果你真的想这样做,你可以使用bind
将它绑定回它的父对象:
variables.map(Variables.create.bind(Variables));
var objA = {
word: 'bar',
say: function() {
alert(this.word);
}
};
var objB = {
word: 'foo',
say: function() {
alert(this.word);
}
};
var say = objA.say;
var bound = objA.say.bind(objB);
objA.word; // bar
objA.say(); // bar
objB.word; // foo
objB.say(); // foo
say(); // undefined --> this.word
bound(); // foo
// bonus fun
word = 'hello'; // 'this' is the global scope here so this.word === word
say(); // hello

对于长篇答案,我建议您阅读You Don't Know JS: this & Object Prototypes。