es6对象
一、面向对象技术
对象:
ECMA-262 把对象(object)定义为“属性的无序集合,每个属性存放一个原始值、对象或函数”。严格来说,这意味着对象是无特定顺序的值的数组。
类:
每个对象都由类定义,可以把类看做对象的配方
实例:
程序使用类创建对象时,生成的对象叫作类的实例(instance)
面向对象语言的要求
封装
继承
多态
聚集
对象的构成:
属性和方法
二、对象引用
对象的创建和销毁都在 JavaScript 执行过程中发生,理解这种范式的含义对理解整个语言至关重要。
声明和实例化:
对象的创建方式是用关键字 new 后面跟上实例化的类的名字
对象引用:
对象是引用类型
对象废除:
垃圾回收机制
早绑定和晚绑定
所谓绑定(binding),即把对象的接口与对象实例结合在一起的方法
ECMAScript 中的所有变量都采用晚绑定方法。这样就允许执行大量的对象操作,而无任何惩罚
三、对象类型
可以创建并使用的对象有三种:本地对象、内置对象和宿主对象
本地对象:
ECMA-262 把本地对象(native object)定义为“独立于宿主环境的 ECMAScript 实现提供的对象”。简单来说,本地对象就是 ECMA-262 定义的类(引用类型)
内置对象:
ECMAScript 实现提供的、独立于宿主环境的所有对象,在 ECMAScript 程序开始执行时出现”。这意味着开发者不必明确实例化内置对象,它已被实例化了。ECMA-262 只定义了两个内置对象,即 Global 和 Math (它们也是本地对象,根据定义,每个内置对象都是本地对象)
宿主对象:
所有非本地对象都是宿主对象(host object),即由 ECMAScript 实现的宿主环境提供的对象。
所有 BOM 和 DOM 对象都是宿主对象。
四、对象作用域
在传统的面向对象程序设计中,主要关注于公用和私有作用域。公用作用域中的对象属性可以从对象外部访问,即开发者创建对象的实例后,就可使用它的公用属性。而私有作用域中的属性只能在对象内部访问,即对于外部世界来说,这些属性并不存在。这意味着如果类定义了私有属性和方法,则它的子类也不能访问这些属性和方法。
ECMAScript 只有公用作用域
建议性的解决方法:
由于缺少私有作用域,开发者确定了一个规约,说明哪些属性和方法应该被看做私有的。这种规约规定在属性前后加下划线:
静态作用域:
静态作用域定义的属性和方法任何时候都能从同一位置访问
ECMAScript 没有静态作用域
关键字this
在 ECMAScript 中,要掌握的最重要的概念之一是关键字 this 的用法,它用在对象的方法中。关键字 this 总是指向调用该方法的对象.
为什么使用 this 呢?因为在实例化对象时,总是不能确定开发者会使用什么样的变量名。使用 this,即可在任何多个地方重用同一个函数
四、定义类或对象
原始的方式
工厂方式
为函数传递参数
在工厂函数外定义对象的方法
构造函数方式:
原形方式
首先用空构造函数来设置类名。然后所有的属性和方法都被直接赋予 prototype 属性
此外,使用这种方式,还能用 instanceof 运算符检查给定变量指向的对象的类型
混合的构造函数/原型方式
联合使用构造函数和原型方式,就可像用其他程序设计语言一样创建对象。这种概念非常简单,即用构造函数定义对象的所有非函数属性,用原型方式定义对象的函数属性(方法)。结果是,所有函数都只创建一次,而每个对象都具有自己的对象属性实例。
动态原型方法
混合工厂方式
建议使用:
function Car(sColor,iDoors,iMpg) {
this.color = sColor;
this.doors = iDoors;
this.mpg = iMpg;
this.drivers = new Array("Mike","John");
}
Car.prototype.showColor = function() {
alert(this.color);
};
var oCar1 = new Car("red",4,23);
var oCar2 = new Car("blue",3,25);
oCar1.drivers.push("Bill");
alert(oCar1.drivers); //输出 "Mike,John,Bill"
alert(oCar2.drivers); //输出 "Mike,John"
五、修改对象
prototype 属性不仅可以定义构造函数的属性和方法,还可以为本地对象添加属性和方法。
创建新方法:
通过已有的方法创建新方法
重命名已有方法
为本地对象添加新方法
重新定义已有的方法
极晚绑定:即能够在对象实例化后再定义它的方法。不建议使用极晚绑定方法,因为很难对其跟踪和记录
浙公网安备 33010602011771号