为什么 JavaScript(直到 ES6)有对象的概念,但是却没有像其他的语言那样,有类的概念呢;
为什么在 JavaScript 对象里可以自由添加属性,而其他的语言却不能呢?
-
什么是面向对象
一个可以触摸或者可以看见的东西;
人的智力可以理解的东西;
可以指导思考或行动(进行想象或施加动作)的东西。 -
JavaScript 对象特征
对象具有唯一标识性:即使完全相同的两个对象,也并非同一个对象。
对象具有唯一标识的内存地址 所以具有唯一的标识对象有状态:对象具有状态,同一对象可能处于不同状态之下。
对象具有行为:即对象的状态,可能因为它的行为产生变迁。
JS中行为和状态都能用属性来抽象 ( python 中的类中的成员和方法 )- 对象具有高度的动态性 因为JS赋予了使用者在运行时为对象添改状态和行为的能力
var o = {a:1};
o.b = 2;
console.log(o.a, o.b); // 1 2
JS属性提供了 getter / setter 两类
- 对象具有高度的动态性 因为JS赋予了使用者在运行时为对象添改状态和行为的能力
-
JavaScript对象的两类属性
a. 数据属性
value:就是属性的值。
writable:决定属性能否被赋值。
enumerable:决定 for in 能否枚举该属性。
configurable:决定该属性能否被删除或者改变特征值。使用 Object.getOwnPropertyDescriptor 来查看
b. 访问器( getter/setter )属性
getter:函数或 undefined,在取属性值时被调用。
setter:函数或 undefined,在设置属性值时被调用。
enumerable:决定 for in 能否枚举该属性。
configurable:决定该属性能否被删除或者改变特征值。创建对象时 也可以使用 get set 关键字来创建访问器属性
var o ={
get a(){
return 1
}
}使用 Object.defineProperty定义属性
var o = { a: 1 }; Object.defineProperty(o, "b", {value: 2, writable: false, enumerable: false, configurable: true}); //a和b都是数据属性,但特征值变化了 Object.getOwnPropertyDescriptor(o,"a"); // {value: 1, writable: true, enumerable: true, configurable: true} Object.getOwnPropertyDescriptor(o,"b"); // {value: 2, writable: false, enumerable: false, configurable: true} o.b = 3; console.log(o.b); // 2
使用 Object.getOwnPropertyDescriptor 来查看
var o = { a: 1 }; o.b = 2; //a和b皆为数据属性 Object.getOwnPropertyDescriptor(o,"a") // {value: 1, writable: true, enumerable: true, configurable: true} Object.getOwnPropertyDescriptor(o,"b") // {value: 2, writable: true, enumerable: true, configurable: true}