【问题标题】:Javascript object attributes?Javascript对象属性?
【发布时间】:2018-05-21 13:25:21
【问题描述】:

我知道所有对象属性都有名称和属性,例如valueconfigurableenumerablewritable。但是in this 帖子我读到对象也具有prototypeclassextensible 等属性。

我了解prototype 属性用于指向父对象。但我不明白class 属性是什么?有这样的属性吗? extensible 不是 isExtensible() 的对象方法吗?

【问题讨论】:

  • 不,这些都不是属性(就像isExtensible一样),这些都可以被认为是内部插槽;而实际的 property prototype 完全是另外一回事。

标签: javascript ecmascript-6 prototype


【解决方案1】:

在这篇文章中,我了解到对象也具有 prototypeclassextensible 等属性。

它们通常不称为“属性”,而是internal slots。通常它们用双括号表示,以区别于普通属性,即 [[prototype]]、[[class]] 和 [[extensible]]。

什么是 [[class]] 属性?有这样的属性吗?

不再在 ES6 中。 [[class]] 内部槽包含有关对象是哪种内置类型(例如 Array、RegExp、内置包装器)的信息。当您在对象上使用Object.prototype.toString 方法时会显示它。 (查看Why can Object.prototype.toString.call(foo) detect foo's type?Why does `Object.prototype.toString` always return `[object *]`? 了解更多详情 - 这也是在Array.isArray 可用之前检测对象是否为数组的最佳方法。

从 ES6 开始,不再有这样的内部插槽,Object.prototype.toString 现在依赖于Symbol.toStringTag 机制。

难道不是像 isExtensible() 那样可扩展的对象方法吗?

不,[[extensible]] 内部插槽是isExtensible() 访问的东西,Object.preventExtensions() 可以设置。

【讨论】:

  • 谢谢,不知道internal slots
猜你喜欢
  • 2014-07-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-25
  • 2012-03-16
  • 2013-04-11
  • 2011-08-20
  • 2016-07-13
相关资源
最近更新 更多