JavaScript 常用功能总结(3)

方法是在构造函数的原型上定义的,可以通过对象创建的构造器调用,如Array.prototype.forEach;Array表示构造器,调用类的实例作为上下文对象参考的,如下: 在foreach中numbers表示上下文对象:

var numbers = [1,2,3];  // create an instance of Array numbers.forEach( function (n) {   console.log( n); });

无论原型方法是否被上下文对象调用,但是只要是参数为对象,可以使用JS函数的Call 方法来辅助调用对象。如下,我们可以使用foreach 循环方法:

var sum = function () {   var result = 0;   Array.prototype.forEach.call( arguments, function (n) {     result = result + n;   });   return result; };

Function.prototype.call方法和apply都是为了改变某个函数运行时的 context 即上下文而存在的。

  定义和使用类

类是面向对象中的基本概念,对象的实例化称为类。JS中定义类需要满足以下五个需求:1.指定类的名称,实例级别的属性和方法,类级别的属性和方法。2. 是可预测的实力,能够用于验证是否是某一对象的实例。3. 实例级别的属性用于检测对象的直接类型。4. 属性继承5.方法继承。

除此之外还支持对哦集成和多分类。

JS中对类没有统一的定义规范,可以使用不同代码模式来定义类,并应用于多种不同的框架。JS中最常用的定义类的方法如下:

1. 构造函数规范,可通过prototype chain实现方法继承,并支持创建新的类实例。

2. factory 对象,用于预定义Object.create 方法来创建新实例。该方法中基于构造函数的继承机制可以被其他机制代替。

创建App都需要使用类,因此经常需要定义类之间的关系,所以必须保证,使用相同类

  Constructor-based classes  

只有ES6引入了定义基于构造器的类。新语法支持定义一些简单的类继承,具体步骤如下:

Step 1.a 基类Person 具有两个属性,first Name 和Last Name,实例层的方法toString和静态方法checkLastName;

class Person {   constructor( first, last) {    this.firstName = first;    this.lastName = last;   }   toString() {    return this.firstName + " " +        this.lastName;   }  static checkLastName( ln) {    if (typeof(ln)!=="string" ||          ln.trim()==="") {       console.log("Error: " +          "invalid last name!");     }   } }

Step 1.b 类层次的属性定义:

Person.instances = {};

在第二步中,会定义一个带有其他属性和方法的子类,也有可能重写父类的相关方法:

class Student extends Person {   constructor( first, last, studNo) {     super.constructor( first, last);    this.studNo = studNo;    }  // method overrides superclass method   toString() {    return super.toString() + "(" +        this.studNo +")";   } }

ES5中,可以定义继承基于构造器类的子类。如下:

Step1.a 首先定义构造函数,能够隐式的定义类的属性并赋值;

function Person( first, last) {  this.firstName = first;    this.lastName = last;  }

注意,上述代码中的this 指的是新生成的对象,当构造函数被调用时,该对象就已经生成了。

Step1.b 定义实例层的方法:

Person.prototype.toString = function () {  return this.firstName + " " + this.lastName; }

Step 1.c 定义静态方法:

Person.checkLastName = function (ln) {  if (typeof(ln)!=="string" || ln.trim()==="") {     console.log("Error: invalid last name!");   } }

Step 1.d 定义类层次的静态属性

Person.instances = {};   Step 2.a 定义子类:    1:  function Student( first, last, studNo) {    2:    // invoke superclass constructor    3:    Person.call( this, first, last);    4:    // define and assign additional properties    5:    this.studNo = studNo;    6:  }

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/3ff3025158fc7d0cb2968a3f0c15d609.html