03JavaScript对象——面向对象

1.关于对象的两个疑惑

2.面向对象与JavaScript对象

1.关于对象的两个疑惑

  • 为什么JavaScript(直到ES6)有对象的概念,但是没有类的概念?
  • 为什么再JavaScript对象里可以自由地添加属性,而其他语言却不可以?

2.面向对象与JavaScript对象

面向对象

Object(对象)再英文中是一切事物的总称,但是中文中是一个专业名词。
在不同的编程语言中,设计者也利用了各种不同的语言特性来描述对象,最为成功的是使用“类”的方式描述对象,如Java、c++,而JavaScript选择了一个冷门的方式:原型。

JavaScript对象

JavaScript对象的特征
  1. 对象具有唯一唯一标识性:即使完成相同的两个对象,也并非同一个对象。
  2. 对象有状态:对象具有状态,同一对象可能处于不同状态。
  3. 对象有行为:即对象的状态可能因为它的行为产生变迁。
var o1 = {
      a: 1}
var o2 = {
      a: 1}
console.log(o1 == o2)   // false

关于第二和第三个特征,Java称他们为“属性”和“方法”,在JavaScript中将状态和行为抽象为“属性”,具体例子可以看下面代码:

var o = {
     
	d: 1;
	f(){
     
		console.log(this.d)
	}
}

在对象o中,d是一个属性,函数f也是一个属性。
在JavaScript中,对象的状态和行为都被抽象为了属性。
在实现了对象基本特征的基础上,JavaScript对象独有的 特色是:
对象具有高度的动态性,这是因为JavaScript赋予了使用者在运行时为对象添改对象的行为和能力。

var o = {
      a: 1 }
o.b = 2
console.log(o.a, o.b)   // 1  2

JavaScript对象的两类属性

JavaScript用一组特征来描述属性。属性分为数据属性和访问器属性。

数据属性
  • value:属性的值。
  • writable:决定属性能否被赋值。
  • enumerable:决定for in能否枚举该属性。
  • configurable:决定该属性能否被删除或者改变特征值。
访问器属性(getter/setter)
  • getter:函数或者undefined,在取属性值时被调用。
  • setter:函数或者undefined,在设置属性值时被调用。
  • enumerable:决定for in 能否枚举该属性。
  • configurable:决定该属性能否被删除或者改变特征值。

通过内置函数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}

通过内置函数Object.defineProperty(对象,“属性”,{访问器key:value})定义访问器属性或属性特征

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

你可能感兴趣的:(重学前端)