`this`访问对象属性

时间:2020-08-15 16:30:30

标签: javascript

class Test {
  X = 'X';
  someFunc = () => {
    console.log('someFunc is called');
    //someFunc2(); // undefined
    this.someFunc2(); //works
  }

  someFunc2() {
    console.log('someFunc2 is called');
  }
}

Z = new Test();
console.log(Z.hasOwnProperty('X')); // true
console.log(Z.hasOwnProperty('someFunc')); // true
console.log(Z.hasOwnProperty('someFunc2')); // false

Z.someFunc();

据我所知,我在尝试引用/使用某些对象属性时使用了this关键字,但在上面的代码中我尝试测试的是{{1} }是对象的属性,它返回false,但仍可以通过someFunc2进行调用。那么这是否意味着this.someFunc2();关键字不用于访问对象属性?

3 个答案:

答案 0 :(得分:1)

我认为console.log(Z.hasOwnProperty('someFunc2')); // false对JavaScript中的this来说不是问题。它更多地与函数声明有关。

someFunc = ()=>{
    console.log('someFunc is called');
    //someFunc2(); // undefined
    this.someFunc2(); //works
}

是分配了匿名功能的属性。而

someFunc2(){
    console.log('someFunc2 is called');
}

是简写函数定义。供参考:

class Test {
  X = 'X';
  someFunc = ()=>{
    console.log('someFunc is called');
    //someFunc2(); // undefined
    this.someFunc2(); //works
  }
  
  someFunc2 = function (){
    console.log('someFunc2 is called');
  }
}

Z = new Test();
console.log(Z.hasOwnProperty('X')); // true
console.log(Z.hasOwnProperty('someFunc')); // true
console.log(Z.hasOwnProperty('someFunc2')); // true 

console.log(Z.hasOwnProperty('someFunc2'));

解析为真!

文档:https://developer.mozilla.org/de/docs/Web/JavaScript/Reference/Functions/Methoden_Definitionen

我的第一个答案,希望对您有所帮助。

答案 1 :(得分:0)

class Test {
  X = 'X';
  someFunc = () => {
    console.log('someFunc is called');
    //someFunc2(); // undefined
    this.someFunc2(); //works
  }

  someFunc2() {
    console.log('someFunc2 is called');
  }
}

class Test {
  X = 'X';
  someFunc = () => {
    console.log('someFunc is called');
    //someFunc2(); // undefined
    this.someFunc2(); //works
  }

  someFunc2 = () => {
    console.log('someFunc2 is called');
  }
}

区别是:

在第一个示例中,我们使用了函数定义,但从未将函数分配给任何属性或属性。因此,当您尝试使用 hasOwnProperty 时,它会发现名称 someFunc2 的no属性或属性可用。

class Test {
  ....
  someFunc2() {
    console.log('someFunc2 is called');
  }
}

在第二个示例中,我们为属性 someFunc2 分配了一个匿名函数,因此当您尝试使用 hasOwnProperty 时,它会发现该属性或属性 someFunc2 可用

class Test {
  ...
  someFunc2 = () => {
    console.log('someFunc2 is called');
  }
}

答案 2 :(得分:0)

区别在于箭头功能的工作方式,

箭头函数没有自己的上下文,这意味着它们的“ this”关键字与父函数“ this”关键字(在本例中为Test类)相同,它们都引用相同的上下文。

的含义是,当您使用“ new Test()”启动“ Test”的实例时,“ someFunc”将自动继承该实例的上下文,而“ someFunc2”则不会,并将通过原型链继承。

您可以通过使用

进行确认
console.log(Z.__proto__.hasOwnProperty('someFunc2'))

这就是为什么您仍然可以调用它的原因。

我希望这可以澄清一些确切的事情。

相关问题