javascript - JS Class : Difference between ES6 myFunc(){. .} 和 ES5 myFunc = function() {...} 在类声明中

标签 javascript es6-class function-expression class-fields

<分区>

在下面的代码中,

class PersonClass {
  constructor(fname) {
    this.fname = fname;
  }
  read = function() { console.log('I am reading') }
  speak () { console.log('I am speaking'); }
}

//Instantiate 
let p1 = new PersonClass('Raj')

read = function() { console.log('I am reading') } 成为新创建实例的属性,即

p1.hasOwnProperty('read')true

相对于 speak() { console.log('I am speaking'); } 被分配给 PersonClass.prototype。即

p1.hasOwnProperty('speak')False

p1.__proto__.hasOwnProperty('speak')true

有人能解释一下为什么会这样吗?

本质上,类中两种方法声明方式之间的区别是什么。

我认为 speak() {...} 只是 speak = function() {...}(在 ES6 中)的较短语法

谢谢

最佳答案

read = function() { console.log('I am reading') }

是新的类字段 语法。它实际上与在构造函数中分配给实例的 read 属性相同:

class PersonClass {
  constructor(fname) {
    this.read = function() {
      console.log('I am reading')
    }
    this.fname = fname;
  }
  speak() {
    console.log('I am speaking');
  }
}

speak,另一方面,是一个普通的类方法,也就是说它在原型(prototype)上,PersonClass.prototype,和是一回事Object.getPrototypeOf(p1),与 p1.__proto__ 相同(已弃用语法)。

class PersonClass {
  constructor(fname) {
    this.read = function() {
      console.log('I am reading')
    }
    this.fname = fname;
  }
  speak() {
    console.log('I am speaking');
  }
}
let p1 = new PersonClass('Raj')
console.log(
  PersonClass.prototype.hasOwnProperty('speak'),
  Object.getPrototypeOf(p1) === PersonClass.prototype,
  p1.__proto__ === PersonClass.prototype
);

因此,speak 属性位于实例的内部原型(prototype) 上,而不是实例本身。 read 属性是实例的直接属性,就像 fname 属性一样。

请记住,类字段语法是 still an experimental proposal (第 3 阶段)。它至少在 Chrome 中实现了,但还不是完全正式的。

关于javascript - JS Class : Difference between ES6 myFunc(){. .} 和 ES5 myFunc = function() {...} 在类声明中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57222366/

相关文章:

javascript - 单击时将 div 从当前位置动画到全屏大小,再次单击动画回到原始大小

javascript - 为什么在JavaScript中修改super.method()失败?

javascript - 在 Javascript 中从对象内部引用对象的数组

JavaScript 函数表达式

javascript - d3更新数据和更新图

javascript - 个别输入值不会改变

javascript - 无法读取 null 的属性 ____

Javascript:将变量定义为调用相同函数的匿名函数

javascript - react : How could we check if a state's parameter is not undefined?

Node.js - ES6 模块导入到 Node.js 'require'