重学前端进修笔记(七)--JavaScript对象:面向对象照样基于对象?

笔记申明

重学前端是程劭非(winter)【前手机淘宝前端负责人】在极客时候开的一个专栏,
天天10分钟,重构你的前端学问体系,笔者重要整顿进修历程的一些要点笔记以及感悟,完全的能够到场winter的专栏进修【原文有winter的语音】,若有侵权请联络我,邮箱:kaimo313@foxmail.com。

1、进修JavaScript面向对象时是不是有如许的迷惑?

  • 为何 JavaScript(直到 ES6)有对象的观点,然则却没有像其他的言语那样,有类的观点呢?
  • 为何在 JavaScript 对象里能够自在增加属性,而其他的言语却不能呢?

2、什么是面向对象?

2.1、JavaScript 对象的特性

2.1.1、对象的特性(来自《面向对象分析与设想》一书)

  • 对象具有唯一标识性:纵然完全相同的两个对象,也并不是一致个对象。
  • 对象有状况:对象具有状况,一致对象能够处于差别状况之下。
  • 对象具有行动:即对象的状况,能够因为它的行动发生变迁。

关于第一点:

var a1 = { a: 1 };
var a2 = { a: 1 };
console.log(a1 == a2); // false

关于第二、三点:

  • c++中称”状况和行动”为成员变量成员函数
  • java中则称它们为属性要领
  • javaScript中将状况和行动一致笼统为属性

winter举了个例子,代码以下:

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

上面代码中,o是对象,d是一个属性,而函数f也是一个属性,只是写法不一样,总结来讲,在JavaScript中,对象的状况和行动实在都被笼统为了属性。

2.1.2、JavaScript 中对象独占的特征

对象具有高度的动态性,这是因为 JavaScript 给予了使用者在运行时为对象添改状况和行动的才。

举例申明运行时怎样向一个对象增加属性:

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

为了进步笼统才,JavaScript的属性被设想成比别的言语越发庞杂的情势,它供应了数据属性和接见器属性(getter/setter)两类。

2.2、JavaScript 对象的两类属性

2.2.1、数据属性

4个特性:

  • value:就是属性的值.
  • writable:决议属性可否被赋值.
  • enumerable:决议 for in 可否罗列该属性.
  • configurable:决议该属性可否被删除或许转变特性值.

2.2.2、接见器(getter/setter)属性

2.2.2.1、4个特性:

  • getter:函数或 undefined,在取属性值时被挪用.
  • setter:函数或 undefined,在设置属性值时被挪用.
  • enumerable:决议 for in 可否罗列该属性.
  • configurable:决议该属性可否被删除或许转变特性值.

2.2.2.2、Object.getOwnPropertyDescripterObject​.define​Property()

var o, d;

o = { get foo() { return 17; } };
d = Object.getOwnPropertyDescriptor(o, "foo");
// d {
//   configurable: true,
//   enumerable: true,
//   get: /*the getter function*/,
//   set: undefined
// }

o = { bar: 42 };
d = Object.getOwnPropertyDescriptor(o, "bar");
// d {
//   configurable: true,
//   enumerable: true,
//   value: 42,
//   writable: true
// }

o = {};
Object.defineProperty(o, "baz", {
  value: 8675309,
  writable: false,
  enumerable: false
});
d = Object.getOwnPropertyDescriptor(o, "baz");
// d {
//   value: 8675309,
//   writable: false,
//   enumerable: false,
//   configurable: false
// }

实际上 JavaScript 对象的运行时是一个“属性的鸠合”,属性以字符串或许 Symbol 为 key,以数据属性特性值或许接见器属性特性值为 value。

2.3、小结

  • 因为 JavaScript 的对象设想跟现在主流基于类的面向对象差别非常大,致使有“JavaScript 不是面向对象”如许的说法。
  • JavaScript 言语规范也已明白申明,JavaScript 是一门面向对象的言语,跟JavaScript 的高度动态性的对象体系密不可分。

个人总结

看完winter的这篇文章深感本身的基本之柔弱,越隐约的东西越要清晰其本质,才坚持对事物的准确推断。

    原文作者:凯小默
    原文地址: https://segmentfault.com/a/1190000019076750
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞