对象的属性
按所属关系进行分类
自有属性
意思就是定义在对象本身上面的属性;
例如:下面定义在对象obj上的x,y属性。
let obj = {x:12,y:24}
继承属性
从原型对象上继承而来的属性,称之为继承属性,虽然obj1本身没有定义z属性,但是他的原型链上有z属性,因此当使用obj1.z进行访问的时是可以访问到原型链上的z属性的。
let obj1 = {x:12,y:24}
obj1.__proto__.z = 36
console.log(obj1)
console.log(obj1.z)
按属性的用途进行分类
数据属性
一般来说我们定义的大多数都是数据属性,如下所示:
- 数据属性拥有的属性描述符:
1.value:属性的值
2.writable:属性是否可写
3.enumerable:属性是否可枚举
4.configurable:属性是否可以配置
let obj1 = {x:12,y:24}
obj1.__proto__.z = 36
console.log(obj1)
console.log(Object.getOwnPropertyDescriptor(obj1,"x"))
运行结果:
存取器属性
ES5中,属性值可以使用一个或者两个方法代替,这两个方法就getter和setter定义的属性,这样定义的属性称之为 “存取器属性”,与“数据属性”的属性描述符不同,这里的get相当于数据属性的"value",set相当于"writable"。
let p = {
x:3,
y:4,
get r (){
return Math.sqrt(this.x * this.x + this.y * this.y)
},
set r (newValue){
var oldValue = Math.sqrt(this.x * this.x + this.y * this.y)
var ratio = newValue/oldValue
this.y *= ratio
this.x *= ratio
}
}
console.log(p.r)
console.log(p.hasOwnProperty("r"));
console.log(Object.getOwnPropertyNames(p))
console.log(Object.getOwnPropertyDescriptor(p,"r"))
运行结果: