Skip to content

Javscript 属性和方法

你可以使用 ”.” 或 ”[]” 来访问属性、方法。我们一般会对对象的成员加以区分:成员值为函数的称为方法,值为非函数称为属性,这是按照其他面向对象的语言来称呼的。

但是在 Javascript 中,一个函数其实不会属于某个对象(其实仅仅是一个引用),即该函数不会是某个对象的方法,所以对_方法_这个称呼不是十分严谨,它仅仅是在进行对象_属性访问_的时候,_返回值是函数_罢了《你不知道的 Javascript》。

有几个注意点

  1. ”.” 和 ”[]” 区别:
    • ”.” 一般称为属性访问,且属性名必须满足命名规范;”[]” 一般称为键访问,键名可接受任意的 utf-8/unicode 字符串

    • ”.” 属性名只能为常量;”[]” 可以为变量

    • ”[]” 在 ES6 中可用于计算属性

    • ”.” 和 ”[]” 在 AST 是不一样的,. => PropertyAccessExpression; [] => ElementAccessExpression

[[GET]]、[[PUT]]

对象的_获取属性_、_设置属性_操作。这里注意一点,和 Getter、Setter 不一样的是 [[GET]]、[[PUT]] 是针对对象的操作,Getter、Setter 是针对对象的某个属性的。这里提一嘴,[[GET]]和[[PUT]]是 ES5.1 的文档,ES6 文档内是[[GET]]和[[SET]]

由下面代码假装模拟一个[[GET]] 和 [[PUT]],需要注意的是,[[GET]] 和 [[PUT]]并非只关注本对象,还要_按照原型链往上查找_

const obj = {};
const proxy = new Proxy(obj, {
get() {}, // 假装当成[[GET]]
set() {}, // 假装当成[[PUT]]
});

tips:这里只列举了[[GET]]和[[PUT]],如果你想知道全部的方法,例如[[Delete]],请点这里 —> Algorithms for Object Internal Methods

属性描述符

需要注意的是,属性描述符 configurable、enumerable、writable 默认都是 false

  1. 公共属性描述符: configurable、enumerable
{
configurable: false, // 该属性无法被改变,无法删除,无法重新设置属性描述,且对无法进行的操作静默失败。ps 严格模式下就会报错哦
enumerable: false, // 该属性无法被遍历。ps 有些方法还是可以获取到的,例如 Reflect.ownKeys(),Object.getOwnPropertyNames/getOwnPropertySymbols()
}
  1. 互斥属性描述符,以下两组属性描述符互斥
  • get、set:对获取、设置属性拦截

{
get(){},
set(){},
}
  • writable、value
{
writable: false, // 该属性无法被修改,如果进行修改则静默错误。ps 严格模式下就会报错哦
value: xx,
}

存在性检测

以下方法对对象的属性、方法进行存在检测:

是否检测原型是否包含 enumerable=false是否包含 symbol
in
Reflect.has
hasOwnProperty

迭代

以下方法对对象的迭代

是否遍历原型是否遍历 enumerable=false是否遍历 symbol
for...in
Object.keys()
getOwnPropertyNames
getOwnPropertySymbols
Reflect.ownKeys()