我试图创建一个函数,然后将其附加到现有对象上。 这些是我的对象:
const cake1 = new Obj('cake1','cake','vanilla');
const cake2 = new Obj('cake2','cake','chocolate');
const cake3 = new Obj('cake3','cake','vanilla');
现在他们没有任何方法。
这些是我的功能和数据:
const flavors = ['vanilla','chocolate'];
const isChocolate = (cake , flavors) => {
console.log(cake);
if(typeof cake === 'object' && typeof cake.type !== 'undefined' && cake.type === 'cake'){
if(typeof cake.meta !== 'undefined'){
if(cake.meta === flavors[1]){//Chocolate
return true;
}
}
}
return false;//Any other case
}
const checkTheCake =(flavors,isChocolate) => {
if(isChocolate( this , flavors)) { // this refer to window
console.log('is chocolate');
}else{
console.log('is vanilla');
}
}
最后,我添加了checkTheCake
函数作为方法。
cake1.checkTheCake = checkTheCake;
cake2.checkTheCake = checkTheCake;
cake3.checkTheCake = checkTheCake;
cake1.checkTheCake(flavors, isChocolate);
cake2.checkTheCake(flavors, isChocolate);
cake3.checkTheCake(flavors, isChocolate);
首先,当我运行this
中的代码checkTheCake
时,它引用了窗口对象。
当我将checkTheCake
从表达式更改为语句时,我设法解决了这个问题,它指向了我的Cake对象。
function checkTheCake (flavors,isChocolate){
if(isChocolate( this , flavors)){ //this refers to cake
console.log('is chocolate');
}else{
console.log('is vanilla');
}
}
我的问题是,在这种特殊情况下,为什么javascript的行为如此?
编辑后:起初,我认为问题出在函数语句和函数表达式上,但实际上与Arrow函数有关。