js高程笔记6-7章

第6章数组

1.ES有两种属性:数据属性和访问器属性。属性中包含各类特性,表示属性的各类特征。闭包

数据属性:[[Configurable]],[[Enumerable]],[[Writable]],[[Value]]函数

  修改属性使用方法:Object.defineProperty()this

访问器属性:[[Configurable]],[[Enumerable]],[[Get]],[[Set]]spa

  访问器属性不包含数值。只能经过Object.defineProperty()定义。经过设置set和get函数,分别设置读取和写入的时候的行为。P141prototype

2.属性的特性的其余方法:指针

Object.defineProperties()设置多个属性和其特性code

Object.getOwnPropertyDescriptor()读取属性的特性对象

3.建立对象的模式:blog

4.工厂模式:解决了重复代码问题,但没法识别对象类型

5.构造函数模式:可以识别对象类型,但每一个方法都要在实例上从新建立一遍。不一样实例上的同名函数不等。

  一个函数经过new来调用就是构造函数,直接调用就是普通函数。

6.原型模式:没必要在构造函数中定义对象实例的信息,而是将这些信息直接添加到原型对象中,让全部对象实例共享它包含的属性和方法。

  原型对象:(1)建立新函数时,同时建立函数的prototype属性,指向该函数的原型对象。

       (2)原型对象生成一个constructor属性,指向原型所在函数。

       (3)调用构造函数建立新实例,实例内部包含一个指针[[prototype]],指向原型对象

  原型对象的方法:Object.prototype.isPrototypeOf(实例) 肯定某原型是否为某实例的原型。

          Object.getPrototypeOf(实例) 返回某个实例原型对象

          实例.hasOwnProperty(属性) 当某属性存在于某实例中时,返回true

          in操做符:属性 in 对象,该对象存在某属性时返回true

          Objet.key(实例or原型) 遍历实例或者原型里能够枚举的属性名,返回一个字符串数组

          Object.getOwnPropertyNames(实例或原型) 遍历实例或者原型里的全部属性名,不论是否可枚举,返回一个字符串数组

  若是在调用构造函数建立一个实例后,重写原型对象,那么实例的[[prototype]]没法指向新的原型对象。P156

  原型模式弊端:全部实例拥有相同属性值,因为共享,实例1的修改会在实例2中体现出来

7.组合使用构造函数模式和原型模式:将属性定义在构造函数中,原型定义方法和须要共享的属性

8.动态原型模式:当方法不存在时,就在原型建立方法

9.寄生构造函数模式:在构造函数中建立新对象,再返回该对象。

  构造函数在不返回值的时候,默认会返回新对象实例。经过在构造函数的末尾添加一个return,能够重写调用构造函数返回的值。

10.稳妥构造函数模式:避免使用this和new,某些属性值只有经过惟一的方法才能访问。

 


 

继承方法:

11.原型链:让原型对象等于另外一类型的实例。

  假设另外一类型使用原型模式,做为实例,它继承了另外一类型的全部属性。内部有个[[prototype]]指针指向另外一类型的原型对象。做为原型对象,它拥有本类型的方法,它的 constructor属性指向另外一类型。

  全部函数的默认原型都是Object的实例,因此另外一类型做为Object的实例,有[[prototype]]指针指向Object的原型对象。

  必须在实现继承后再增长原型的方法。不然,方法只会存在于原来默认的原型对象中

  原型链弊端:原型对象做为另外一类型的实例,继承了另外一类型的实例属性。则,该实例属性在本类型的全部实例中,成了共享的原型属性。本类型的实例1对该属性的修改会在实例2体现出来。

        同时,建立子类型的实例时,不能向超类型的构造函数传递参数。

12.借用构造函数:在子类型构造函数内部使用call()调用超类型构造函数,能够避免子类型继承的属性被共享,同时能够向超类型传参。

  弊端:方法在构造函数定义,没法复用。

13.组合继承:使用原型链实现对原型属性和方法的继承,经过借用构造函数来实现对实例属性的继承。

  子类型借用超类型的构造函数,至关因而在子类型上建立了同名的实例属性,从而屏蔽了子类型的原型对象上那个继承而来的属性,避免了属性被共享。

  弊端:会两次调用超类型。一次在建立子类型原型的时候,一次在建立子类型实例时,调用了超类型构造函数为子类型建立属性

14.原型式继承:将已有的对象a做为新建对象b的原型,则b的实例共享a的属性和方法。至关于对a执行了一次浅复制。现有方法:Object.create()

15.寄生式继承:建立一个仅用于封装继承过程的函数,其中方法没法复用。

16.寄生组合式继承:为了不组合继承中两次调用超类型构造函数形成的子类型实例和原型中存在同名的属性,可使用借用构造函数来继承属性,经过原型链的混成形式来继承方法。

  使用寄生式继承来继承超类型的原型,再将结果指定给子类型的原型。将此替换组合类型中为子类型原型赋值的语句。

 

第7章 函数表达式

1.在使用递归的时候,在函数内部使用arguments.callee来调用本身。

2.闭包:有权访问另外一个函数做用域中的变量的函数。

  建立方式:在一个函数内部建立另外一个函数,并返回。

  外部函数在执行完毕后,其执行环境的做用域链会被销毁,但其活动对象不会被销毁,由于内部匿名函数的做用域链仍然在引用这个活动对象。直到内部匿名函数被销毁后,外部函数的活动对象才被销毁。

3.闭包保存的是整个变量对象,而不是某个特殊的变量,所以闭包只能取得包含函数中任何变量的最后一个值。

4.匿名函数的执行环境具备全局性,所以this对象一般指向window。闭包中搜索this和arguments这两个变量时,只会搜索到其活动对象,并不会沿着做用域链访问外部函数的this和arguments。

5.模仿块级做用域:

1 (function(){
2     //这里是块级做用域
3 })();

将函数声明包含在一对圆括号中表示它是一个函数表达式。紧跟着另外一对圆括号表示当即调用这个函数。

6.特权方法:有权访问私有变量和私有函数的公有方法。

  (1)在构造函数中定义特权方法(在构造函数中将特权方法定义为构造函数的方法,经过对象实例来访问)。弊端:必须使用构造函数模式。

  (2)在私有做用域中定义私有变量和函数。在原型上定义了公有方法(在原型对象中将特权方法定义为方法。),体现了原型模式,增长了代码复用。弊端:每一个实例都没有本身的私有变量。P188

7.模块模式:为单例(只有一个实例的对象)建立私有变量和特权方法(将特权方法定义在函数返回的对象字面量中)。

8.加强的模块模式:将返回的对象字面量换成某种类型的实例。用于规定单例是某种类型的实例的状况。

相关文章
相关标签/搜索