JavaScript 基础知识
1. javascript基础系列
JavaScript有5中基本数据类型 undefined Null Number Boolean String 和复杂类型Object。
A) 声明没有赋值 和 没有声明的都是 undefined
B) 只有声明并赋值为null值才会是null
C) typeof(object) 是 “function”
D) typeof(null) 也是”object” 因为null表示一个空对象的指针。并且undefined是派生子null值的。、
E) JavaScript高级程序设计中说到 函数是对象不是一种数据类型。
对象其实就是一个function 或者说Object是一个函数的名字。官方称之为构造函数。
2. 基本包装类型
A) String number boolean 都是基本类型 基本类型和复杂类型的最大的区别就是 基本类型没有prototype属性。 也就意味着你不能给基本类型随意添加方法或者属性。
B) 首字母大写的这个String是一个function,所有new String(“str”)得到的是一个object而不是string。为什么基本类型string会有一些初始的方法? 方法是怎么加上去的?
1> 基于str创建一个String类型的实例。
2> 在实例上调用制定方法
3> 销毁这个实例
3. 我们可以把String Number Boolean叫做封装类型 他们就好像我们在C#里面定义的自定义类型一样 但是不要忘记了我们真正的基本来下是string number boolean。用String 所构造出来的对象是属于object类型的。
4. 在JavaScript中用function定义类 他们的实例将永远是object 包括原来的原生 Date Array RegExp;
5. 借助instanceof来判断一个对象是不是它的实例。
6. 大写的Function,它和function之间的关系会不会和String和string一样。
函数表达式其实就是用一个变量接收了一个function的对象而已,而这个function的对象则是Function的实例 包括函数声明写出来的函数也是Function的实例。
所有的function都是Function的实例。
Function本身也是一个function。
总结:
5中数据类型 Null Undefined String Number Boolean
复杂类型 object 其实是function的实例。
除了Function 这个系统里面的function构造器以外 其他所有function的实例都是object类型的。
Date Array RegExp 这些都是function类型 同时也是Function的实例 同理 它们的实例也是object类型。
二
作用域
1. 引用类型传递

A) 在堆中分配一块空间给person对象 并在栈中保存person在堆中的地址引用。
B) 复制堆中person的地址引用给person2(同样是在栈中)
C) new Person()再次在堆中分配一块空间给person2对象 然后将栈中person2指向这个新的地址
D) 以后对person2的更改不会对person产生影响。
2. 作用域和作用域链
每个 函数都有自己的执行环境 而每一个执行函数都有一个相关联的变量对象。 这个环境中所有变量和函数就保存在这个变量中。除了函数有自己的执行环境以外,我们还有一个最大的全局执行环境,而 我们所熟知的window就是这个全局执行环境的变量对象,因为所有的全局变量和函数都是作为window的属性和方法创建的。每个环境中的所有代码执行 完后,该环境被随之销毁,保存在其中的所有变量和函数也随之销毁。对于全局执行环境来说,关闭浏览器或者退出页面,那这个全局的执行环境也就被销毁了。
作用域链的作用就是保证对执行环境有权访问的所有变量和函数进行有序访问。
作用域链的最前端永远是当前执行代码所在的环境的变量对象 。
三
面向对象 原型
1. 什么是对象
对象可以理解为一组无序的键值对。Key是属性的名称 value可以分为3中类型。
基本类型(String Number Boolean null undefined)
对象
函数

2. 构造函数模式

3. this

上面的函数independent如果直接执行 调用它的是window 所以this指向的就是window。但是将independent设为对象o的一个属性 那么independent中的this就指向这个实例。同理this.pop就变成了对象o的pop属性。
4. 构造函数的this指向的是实例化出来的对象。
5. bind方法是存在于function的原型中的Function.prototype.bind,也就是说所有的function都会有这个方法 但我们调用某一个方法的bind的时候 会产生一个原来那个方法一样的新方法,只不过this是指向我们传得bind的第一个参数。
6. 原型
在js中每一个函数都会有一个原型对象 这个原型对象和我们普通对象没有区别 只不过默认会有一个constuctor属性指向这个函数,同时所有这个函数的实例都会有一个音乐指向这个原型对象。

构造函数 构造函数原型 以及实例的关系, 以Person构造函数为例,所有Person的实例 都指向一个prototype属性指向了Person构造函数prototype对象,如此一来 我们可以把方法写在原型上 那么我们所有实例就会访问同一个方法。

7. 原型链
如果我们在一个执行环境中访问某个变量的时候 如果当前这个执行环境中不存在这个变量 那么就会到这个执行环境的包含环境(就是外层去找)中寻找这个变量 外层还找不到 一直到全局执行环境。这就是作用域链。而原型链有点类型,只不过场景换到了我们的对象实例中,如果我在一个实例中找某一个属性,这个实例中没有,那就会到它的原型中去找。记住,我们上面说了, 原型也是一个对象,它也有自己的原型对象,所以就行成了一个链,实例自己的原型中找不到,那就到原型的原型对象中去找,一直向上延伸到Object的原型 对象,默认我们创建的函数的原型对象它自己的原型对象是指向Object的原型对象的,所以这就是为什么我们可以在我们的自定义构造函数的实例上调用 Object的方法(toString, valueOf)。


浙公网安备 33010602011771号