JavaScript 类(笔记)

来源:互联网 发布:java开发工作经历描述 编辑:程序博客网 时间:2024/05/01 16:32

类和原型

      在JavaScript中,类的所有实例对象都从同一个原型对象上继承属性。因此,原型对象是类的核心。
      类的实例需要进一步的初始化,通常是通过定义一个函数来创建并初始化这个新对象。类定义了原型对象,可以通过“工厂”函数用以创建并初始化类的实例

类和构造函数

      使用关键字new来调用构造函数会自动创建一个新对象,因此构造函数本身只需初始化这个新对象的状态即可。调用构造函数的一个重要特征是,构造函数的prototype属性被用做新对象的原型。
      从某种意义上讲,定义构造函数既是定义类,并且类名首字母要大写。而普通的函数和方法都是首字母小写。

      构造函数和类的标识

              原型对象是类的唯一标识:当且仅当两个对象继承自同一个原型对象时,它们才是属于同一个类的实例。而初始化对象的状态构造函数则不能作为类的标识,两个构造函数的prototype属性可能指向同一个原型对象。那么两个构造函数创建的实例属于同一个类。

      constructor属性

               任何JavaScript函数都可以用做构造函数,并且调用构造函数是需要用到一个prototype属性的。因此,每个JavaScript函数(ECMAScript 5 中的Function.bind()方法返回的函数除外)都自动拥有一个prototype属性。这个属性的值是一个对象,这个对象包含唯一一个不可枚举属性constructor。constructor属性的值是一个函数对象。
               构造函数的原型中存在于先定义阿红的constructor属性,这意味着对象通常继承的constructor均指代它们的构造函数。由于构造函数是类的“公共标识”,因此这个constructor属性为对象提供了类。

JavaScript中Java式的类继承

        JavaScript中的类牵扯三种不同的对象,三种对象的属性的行为和下面三种类成员非常相似:
              构造函数对象
                         构造函数对象为Javascript的类定义了名字。任何添加到这个构造函数对象中的属性都是类字段和类方法(如果属性值是函数的话就是类方法)。
              原型对象
                          原型对象的属性被类的所有实例所继承,如果原型对象的属性值是函数的话,这个函数就作为类的实例方法来调用。
              实例对象
                          累的每个势力都是一个独立的对象,直接给这个实例定义的属性是不会为所有实例对象所共享的。定义在实例上的非函数属性,实际上市实例的字段。

类的扩充

        JavaScript中基于原型的继承机制是动态的:对象从其原型继承属性,如果创建对象之后原型的属性发生改变,也会影响到继承这个原型的所有实例对象。这意味着我们可以通过给原型对象添加新方法来扩充JavaScript类。

类和类型

      三种用以检测任意对象的类的技术:instanceof 运算符,constructor属性,以及构造函数的名字。

      instanceof运算符

                左操作数是待检测其类的对象,有操作数是定义类的构造函数。instanceof运算符和isPrototypeOf()方法的缺点是,无法通过对象来后的类名,智能检测对象时候属于指定的类名。

       constructor属性

                 另一种识别对象是否属于某个类的方法是使用constructor属性。因为构造函数是类的公共标识,所以最直接的方法就是使用constructor属性。

      构造函数的名称

                  使用instanceof运算符和constructor属性来检测对象所属的类有一个主要的问题,在多个执行上下文中存在构造函数的多个副本的时候,这两种方法的检测结果会出错。多个执行上下文中的函数看起来是一模一样的,但是它们是相互独立的对象,因此彼此也不相等。
                  一种可能的解决方案是使用构造函数的名字而不是构造函数本身作为类标识符。
0 0