一. 简介

JavaScript是一门脚本语言, 是一门解释型语言, 是一门弱类型语言, 是一门基于对象的语言, 是一门动态的语言

Javascript的组成
        1.ECMAscript标准—基础语法和基本对象
        2.DOM Document Object Model 文档对象模型 :描述了处理网页内容的方法和接口
        3.BOM Browser Object Model 浏览器对象模型
Javascript能做什么
        Js最初的目的:解决用户和服务器之间的交互问题
        现在:js可以做特效,游戏,移动,服务器

脚本语言:  我想许多人并不是困惑脚本语言和非脚本语言的不同,而是困惑脚本语言为什么叫脚本语言。脚本是由script翻译来的,这个词在用到计算机前的意思是剧本,现在把script还原到原有的意思——“剧本”来理解其在编程中的延伸意义。(脚与非脚的不同在于执行之前是否需要编译)我们可以把“编译”对应到制作电影时的“拍摄”,就是由源代码生成可执行程序的过程。脚本语言不需要编译,即这个剧本不需要拍摄成电影,一句一句“解释”着执行就可以了。

解释型语言:  计算机是不能理解高级语言的,更不能直接执行高级语言,它只能直接理解机器语言,所以使用任何高级语言编写的程序若想被计算机运行,都必须将其转换成计算机语言,也就是机器码。释型语言不需要事先编译,其直接将源代码解释成机器码并立即执行

弱类型语言: 数据类型可以被忽略的语言。它与强类型定义语言相反, 一个变量可以赋不同数据类型的值。例如java中如果一个变量类型为字符串, 那么它的值只能为字符串类型,  而在js中则可以赋值为不同类型

基于对象的语言:  首先js不是一门面向对象的语言,JS是一门基于对象的语言,那为什么学习js还要学习面向对象?因为面向对象的思想适合于人的想法,编程起来会更加的方便,及后期的维护。

面向对象的编程语言中有类(class)的概念(也是一种特殊的数据类型),但是js不是面向对象的语言,所以js中没有类(class)的概念,但是Js可以模拟面向对象的思想编程,Js中会通过构造函数来模拟类(class)的概念

面向对象的特性:封装,继承,多态

动态的语言:  静态类型语言在编译时便已确定变量的类型,而动态类型语言的变量类型要到程序运行的时候,待变量被赋予某个值之后,才会具有某种类型。


二. 数据类型

Javacript中的数据类型大致分为基础数据类型和复杂数据类型

  • 基础数据类型(值类型)

Undefined

Null

Boolean

Number

String

  • 复杂数据类型

object

array

Date

RegExp

Function

  • 基本包装类型

        Boolean

        Number

        String

  • 单体内置对象

        Global

        Math

用typeof判断当前的数据类型

例如: 

console.log(typeof 'string')  // String

值类型和引用类型差别

  • 基本类型在内存中占据固定的空间,因此被保存在栈内存中
  • 从一个变量向另一个变量复制基本类型的值,复制的是值的副本
  • 引用类型的值是对象,保存在对内
  • 引用类型的值是对象,保存在堆内存
  • 从一个变量向另一个变量赋值引用类型的值的时候,赋值的是引用指针,因此两个变量最终都指向同一个对象

三. JavaScript面向对象简介

在学习js的工程中始终要保持着万物皆对象的思想

对象:特指 的某个事物,具有属性和方法(一组无序的属性的集合)
           特征:----->属性
           行为:----->方法
对象是单个事物的抽象
对象是一个容器,封装了属性(prototype)和方法(method)。属性是对象的特征,方法是对象的行为
ECMAScript-262 把对象定义为:无序属性的集合,其属性可以包含基本值、对象或者函数。严格来讲对象是一组没有特定顺序的值。

什么是面向对象?

面向对象编程 ----(Object Oriented Programming),简称OOP,是一种编程开发思想
这种思想将真实世界各种复杂的关系,抽象为一个个对象,然后由对象之间的分工与合作,完成对真是世界的模拟。
在面向对象程序开发思想中,每个对象都是功能中心,具有明确分工,可以完成接受信息、处理数据、发出信息等任务。因此,面向对象编程具有灵活、代码可复用、高度模块化等特点,容易维护和开发,比起由一些列函数或指令组成的传统的过程式编程(procedural programming)更适合多人合作的大型软件项目

面向对象和面向过程

  • 面向过程:  所有的事情都是亲力亲为,注重的是过程.
  • 面向对象:  提出需求,找对象,对象解决,注重的是结果。 面向对象不是面向过程的代替,而是面向过程的封装。

面向对象的特征

  • 封装:就是包装,把一些重用的内容进行包装,在需要的时候直接使用
  • 继承:类与类之间的关系,js中没有类的概念,js中有构造函数的概念,是可以有继承的,是基于原型的。
  • [多态] :同一个行为,针对不同的对象产生了不同的效果。
  • (抽象性) js中一般不谈
//封装对象

function Fn(name, age, sex) {
    this.name = name
    this.age = age
    this.sex = sex
    this.play = function() {
        console.log('我会唱歌')
    }
}

var fn1 = new Fn('刘德华', 18, '男')

四. 原型和原型链

什么是原型?

  • 实例对象中有__proto__这个属性, 叫原型, 也是一个对象, 这个属性是给浏览器使用的,不是标准属性.
  • 构造函数中有prototype这个属性,叫原型,也是一个对象,这个属性是给程序员使用的,是标准的属性. prototype 可以叫原型对象

JavaScript可以写游戏脚本自动打怪 js能写游戏脚本吗_面向对象

 什么是原型链?

当我们用构造函数创建出了一个一个实例对象后, 实例对象proto就会指向创建它的构造函数, 从而可以调用构造函数中proto所拥有的方法, 但在javascript中万物皆对象, 构造函数本身也是基于对象创建的, 那么是对象的话就有自己的原型proto指向创建自己的构造函数! 大致指向如下:

实例对象  proto  ==>  构造函数 proto ==> 构造函数的 proto ==> 最终指向顶级window对象

所谓原型链大致就是实例对象不断向上查找你所需要的属性的proto, 一直到window对象