第九章 类和模块
- 在javascript中,类的实现都是基于其原型继承机制的:如果两个实例从一个原型对象上继承属性,那么我们说他们是同一个类的实例
- 如果定义了一个原型对象,再定一个一个对象通过inherit()函数继承自它,就定义了一个js类。但通常还需要通过定义一个函数来创建并初始化这个实例
- 工厂函数和构造函数创建对象
- 构造函数更加常用,使用new关键字调用函数会自动创建一个对象,它不用返回这个新创建的对象,构造函数会自动创建对象,因此构造函数只需初始化这个实例即可
- 构造函数的prototype属性被用作新对象的原型,因此通过同一个构造函数创建的对象都是同一个类的成员
- 从某种意义上讲,定义一个构造函数即定义一个类,类名首字母要大写,而普通函数名和方法首字母小写
- 任何类的方法都可以通过this关键字读取对象的属性
- 原型对象和类的唯一标识:当且仅当两个对象继承自一个原型对象时,它们才是属于同一个类的实例。若两个构造函数的prototype属性指向同一个原型对象,那么两个构造函数创建的实例属于同一个类
- instance不会检查某个实例是否由某个构造函数创建,而是检查它是否继承自这个构造函数的prototype属性指向的原型
- constructor属性:每个javascript函数(ES5中Function.bind()返回的函数除外)都有一个prototype属性,这个属性的值是一个对象,这个对象拥有唯一一个不可枚举的属性constructor,constructor属性的值是一个函数对象
- 构造函数(prototype ->)/(<- 构造函数)原型/(<- 继承自)实例
- javascript中java式的类继承:实例字段/实例方法/类字段/类方法;构造函数对象/原型对象/实例对象
- 构造函数对象上定义的属性和方法属于类字段和类方法
- 原型对象定义的属性被所有实例继承,如果属性的值是函数,这个函数就作为实例的方法
- javascript中定义类的步骤:1、定义一个构造函数,初始化新对象的实例属性;2、给函数的prototype属性定义实例方法;3、给构造函数定义类字段和类方法
- 可以通过给原型对象添加新的方法来扩充js类
- 如果给Object.prototype添加新属性,这些属性是可以被for/in循环到的
- 使用Object.defineProperty()方法可以解决这个问题
- 类和类型
- 三种检测任意对象的类的方法:instanceof/constructor/构造函数的名字,鸭式辩型
- instance运算符?
- constructor属性?
- 在两个不同框架页面创建两个数组继承自两个相同但相互独立的原型对象,其中一个页面的数组不是另一个页面的Array()构造函数的实例,instanceof运算结果是false
- 构造函数的名称?
- 鸭式辩型?
- javascript中的面向对象技术