专栏首页zaking's《JavaScript 模式》读书笔记(1)— 简介

《JavaScript 模式》读书笔记(1)— 简介

What is 模式?

  广义上的模式是指“重现事件或者对象的主题,……它是一个可以用来产生其他事物的模版或者模型”。在软件开发过程中,模式是指一个通用问题的解决方案。一个模式不仅仅是一个可以用来复制粘贴的代码解决方案,更多地是提供了一个更好的实践经验、有用的抽象化表示和解决一类问题的模板。

  学习和识别模式,是非常重要的,理由如下:

    1. 通过学习模式,可以帮助我们使用经过实践证明有效的经验来编写代码,而不是去做很多无用功。

    2. 模式提供了某种程度上的抽象。大脑在一定的时间内,仅能记住一定数量的内容,因此思考更复杂的问题时,使用模式可以让您集中精力去用已有的模式来解决该问题,而不需要被一些低层次的细节所困扰。

    3. 模式,可以改善开发者和开发团队之间的交流,通常开发者是采取远程交流而不是面对面进行交流。为一些编码技术或方法贴上标签并命名,可以很方便地确保双方能够了解对方确切表达的意思。

  本系列内容,核心讨论以下三种类型的模式,即:设计模式,编码模式以及反模式。尤其要说明的是反模式。反模式并不是一个bug,或者是编码错误,它仅仅是常见的、引发的问题比解决的问题更多的一种方法。

Javascript基础概念 

面向对象

我们经常会聊到面向对象,所以,在这里,我们就把什么是面向对象,到底怎么面向对象开发,来搞一个清楚。

  JavaScript语言有一个特性,即万物皆对象,你看到的任何一段JavaScript代码,都很有可能是一个对象。只有五种基本类型不是对象:数值类型、字符串类型、布尔类型、空类型和未定义类型。其中前三个类型有对应的以基本类型封装形式体现的的对象表示(后面会详细介绍)。数值类型、字符串类型的值可以通过程序员或者位于幕后的JavaScript解析器来实现向对象的转换。

函数实际上也是对象,函数有属性和方法。

  任何一门语言中最简单的事情就是定义一个变量。在JavaScript中,一旦定义好了变量,同时也就已经正在处理对象了。首先,该对象会自动成为内置对象的一个属性,成为激活对象(如果该变量是一个全局变量,那么该变量会成为全局对象的一个属性)。第二,该变量实际上也是伪类(这里我理解为,未通过“显式”的方法,比如构造函数,生成(或继承)的具有属性的一个对象),该属性决定了该变量是否可以被修改、被删除和在一个for-in循环中枚举(可以通过Object.getOwnPropertyDescriptor来查看)。

  那么对象到底是什么呢?其实对象仅仅是一个容器,该容器包含了命名的属性,键值对(大多数)的列表。这里面的属性可以是函数(函数对象),这种情形下我们称其未为方法。

  关于创建的对象的另外一件事情是可以在任意时间修改该对象(尽管ECMAScript引入了API来防止突变)。可以对一个对象执行添加、删除和更新它的成员变量。

  最后,需要记住的是对象主要有两种类型:原生的(Native,如ECMAScript标准),主机的(Host即宿主的,比如浏览器环境)。另外,原生对象可以进一步分为内置对象(例如数组,日期对象等)和用户自定义对象(如var o = {})等。主机对象包含Windows对象和所有的DOM对象。

没有类

在JavaScript中没有类,我们只处理对象。尽量多使用对象的组合,而不是使用类的继承。这句话的意思是通过已有的对象组合来获取新对象,是比通过很长的父 - 子继承链来创建新的对象更好的一方法。

原型

  JavaScript没有继承,尽管这是重用代码的一种方式。可以使用多种方法来实现继承,这里通常使用原型。原型是一个对象,并且创建的每一个都会自动获取一个Prototypes属性,该属性指向一个新的空对象。该对象几乎等同于采用对象字面量或Object()创建的对象,区别在于他的constructor属性指向了所创建的函数,而不是指向内置的Object()函数。可以为该空对象增加成员变量,以后其他对象也可以从该对象继承并像使用自己的属性一样使用该对象的属性。

  要记住,每一个函数都有prototype属性,每一个对象都有一个__proto__属性。(先带着疑问,后面的文章会详细解答。)

  简单的介绍之后,我又想起了最开始聊过的问题。到底什么是面向对象?到底如何面向对象开发(编程)?

  首先要说的是,面向对象与面向对象编程即OOP(Object Oriented Programming)是两回事,个人理解,面向对象是一种描述,我们应该使用怎样的手段去做一件事,而面向对象编程,则是一种方法,也就是说,我们使用面向对象手段方法,去进行开发。另外的,还有函数式编程,那我个人理解,函数式编程也是一种方法,我们使用函数式的方法、方式去编程,编写代码。

  那么面向对象是什么呢?其实我的理解,就是在一切的编程“沟通”中数据流转的执行方式,我们通过对象的方式,去进行数据的传递及流转,那什么是“对象的方式”,即:类与实例,而js中没有类的概念,那么就要使用到原型。所以,在js中发挥原型的能力,使用原型的能力去编程,就可以大概的理解为是面向对象的编程(当然,要知道,这实际上是很片面的理解)。

  希望我的理解没有出现方向性的错误,后面,会详细的介绍原型以及继承的内容。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 《JavaScript 模式》读书笔记(6)— 代码复用模式3

    我们之前聊了聊基本的继承的概念,也聊了很多在JavaScript中模拟类的方法。这篇文章,我们主要来学习一下现代继承的一些方法。

    zaking
  • 《JavaScript 模式》读书笔记(3)— 字面量和构造函数1

      新的篇章开始了,本章开始,所有的内容都是十分有价值和意义的。本章主要的内容包括对象字面量、构造函数、数组字面量、正则字面量、基本值类型字面量以及JSON等。...

    zaking
  • 《JavaScript 模式》读书笔记(6)— 代码复用模式1

      我们有开始进入新篇章了。这篇内容主要讲代码复用模式,实际上代码复用,就是继承啊,原型啊,构造函数啊等等这一类的内容。对于前端进阶来说,是很重要的基础知识。这...

    zaking
  • 《Objective C编程》笔记

    1.为什么main()总是返回0?可以将main()的返回结果视为“粗欧文报告”,这样0就是好消息,没有错误就是成功。 2.消息:消息发送(指令)必须写在一对...

    nimomeng
  • 经典面试题-列举JSP的内置对象,同一应用中页面有哪些方法

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 ...

    cwl_java
  • 关于对象池的一些分析

    在日常的开发工作中,我们可能使用或者听说过对象池,线程池以及连接池。本文将介绍对象池的产生缘由,具体实现细节,以及需要注意的问题。

    技术小黑屋
  • 《Head First 设计模式》笔记

    软件开发的一个不变真理:不管当初软件设计得多好,一段时间后,总是需要成长与改变,否则软件就会“死亡”。

    谛听
  • HotSpot 图解年轻代回收

    实际上,只是用对象的对象头去把对象连接起来(这里说的对象都是 C++ 层面对象的具体实现,也就是 oopDesc 的对象 在内存中占用的一段内存块)

    执生
  • PHP深复制与浅复制

    PHP5使用了Zend引擎II,对象被储存于独立的结构Object Store中,而不像其它一般变量那样储存于Zval中(在PHP4中对象和一般变量一样存储于Z...

    用户7657330
  • python传参是传值还是传引用

    在此之前先来看看变量和对象的关系:Python 中一切皆为对象,数字是对象,列表是对象,函数也是对象,任何东西都是对象。而变量是对象的一个引用(又称为名字或者标...

    用户1679793

作者介绍

zaking
  • 云+社区翻译社勋章

小叶云(北京)信息技术有限公司前端开发工程师

小叶云(北京)信息技术有限公司 · 前端开发工程师 (已认证)

精选专题

活动推荐

扫码关注云+社区

领取腾讯云代金券