重学前端学习笔记(七)--JavaScript对象:面向对象还是基于对象?

栏目: JavaScript · 发布时间: 5年前

内容简介:重学前端是程劭非(winter)【前手机淘宝前端负责人】在极客时间开的一个专栏,关于第一点:关于第二、三点:

笔记说明

重学前端是程劭非(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
configurable

2.2.2、访问器(getter/setter)属性

2.2.2.1、4个特征:

getter
setter
enumerable
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的这篇文章深感自己的基础之薄弱,越模糊的东西越要清楚其本质,才能保持对事物的正确判断。


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Ruby on Rails电子商务实战

Ruby on Rails电子商务实战

Christian Hellsten、Jarkko Laine / 曹维远 / 人民邮电出版社 / 2008-4 / 49.00元

《Ruby on Rails电子商务实战》全面讲解了使用Ruby on Rails创建产品级应用程序的过程。书中通过演示构建网上书店的全过程,先后介绍如何使用如TDD的敏捷实践,启动一个项目并建立良好稳定的基础,如何深入Ruby on Rails,实现诸如将应用程序翻译成各种语言对产品进行调试等的普遍需求。其中用到的主要技术包括Ajax、聚合、设置标签和国际化等,还介绍了如何使用ActiveRec......一起来看看 《Ruby on Rails电子商务实战》 这本书的介绍吧!

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具