面向对象的程序设计
基本包装类型
基本数据类型,是没有本身的自己内置的方法,但是ES中有三个特殊引用类型:Boolean、Number、String。基本包装类型和引用数据类型一样,拥有内置方法可以对数据进行操作。
Boolean:
Boolean 类型没有特定的属性或者方法。一般直接将Boolean当做一个工具方法来使用。
Number:
内置属性:
属性 | 描述 |
---|---|
MAX_VALUE | 可表示的最大的数。 |
MIN_VALUE | 可表示的最小的数。 |
NaN | 非数字值。 |
NEGATIVE_INFINITY | 负无穷大,溢出时返回该值。 |
POSITIVE_INFINITY | 正无穷大,溢出时返回该值。 |
prototype | 使您有能力向对象添加属性和方法。 |
内置方法:
方法 | 描述 |
---|---|
toString | 把数字转换为字符串,使用指定的基数。 |
toLocaleString | 把数字转换为字符串,使用本地数字格式顺序。 |
toFixed | 把数字转换为字符串,结果的小数点后有指定位数的数字。 |
toExponential | 把对象的值转换为指数计数法。 |
toPrecision | 方法可在对象的值超出指定位数时将其转换为指数计数法。 |
valueOf | 返回一个 Number 对象的基本数字值。 |
String:
对象属性:
属性 | 描述 |
---|---|
constructor | 对创建该对象的函数的引用 |
length | 字符串的长度 |
prototype | 允许您向对象添加属性和方法 |
字符方法:
方法 | 描述 |
---|---|
charAt(index) | 返回指定索引位置的字符 |
charCodeAt(index) | 以Unicode编码形式返回指定索引位置的字符 |
字符串操作方法:
方法 | 描述 |
---|---|
concat() | 连接字符串。 |
slice() | 方法可提取字符串的某个部分,并以新的字符串返回被提取的部分。 |
substring() | 提取字符串中两个指定的索引号之间的字符。 |
substr() | 从起始索引号提取字符串中指定数目的字符。 |
字符串位置方法:
方法 | 描述 |
---|---|
indexOf(str,n) | 从n开始搜索第一个str,并将搜索的索引值返回 |
lastIndexOf(str,n) | 从n开始搜索的最后一个str,并将搜索的索引值返回 |
大小写转换方法:
方法 | 描述 |
---|---|
toLowerCase() | 把字符串转换为小写。 |
toUpperCase() | 把字符串转换为大写。 |
toLocaleLowerCase() | 把字符串转换为小写。本地化 |
toLocaleUpperCase() | 把字符串转换为大写。本地化 |
字符串的模式匹配方法:
方法 | 描述 |
---|---|
match() | 找到一个或多个正则表达式的匹配。 |
replace() | 替换与正则表达式匹配的子串。 |
search() | 检索与正则表达式相匹配的值。 |
split() | 把字符串分割为字符串数组。 |
深入理解对象
工厂模式:
优点:批量创建对象 封装创建对象的函数 提高代码复用率
缺点:无法区分创建出来的对象种类 方法冗余
//将创建对象的代码封装在一个函数中
function createPerson(name, age, gender) {
var person = new Object();
person.name = name;
person.age = age;
person.gender = gender;
person.sayName = function () {
console.log(this.name);
}
return person;
}
//利用工厂函数来创建对象
var person1 = createPerson("zhangsan", 18, 'male');
var person2 = createPerson("lisi", 20, 'female');
构造函数:构造函数函数名首字母要大写,在创建构造函数实例时候,要使用new操作符构造一个新对象
优点:可以区分种类
缺点:方法还是冗余
var Person = function (name, age, gender) {
this.name = name;
this.age = age;
this.gender = gender;
this.sayName = function () {
console.log(this.name);
};
}
// 作为构造函数
var person = new Person("Jacky", 29, "male");
person.sayName(); // Jacky
// 作为函数调用
Person("lisi", 27, "female"); // 添加到全局对象 node global 浏览器 window
global.sayName(); // lisi
// 在另一个对象的作用域中调用
var o = new Object();
Person.call(o, "wangwu", 25, "male");
o.sayName(); // wangwu
原型模式:通过调用构造函数创建的对象的原型
优点:将所有的属性和方法都放到原型对象中
缺点:不单独使用
function Person() {}
Person.prototype = {
constructor: Person,
name: "zhangsan",
age: 29,
gender: "male",
sayName() {
console.log(this.name);
}
};
var person1 = new Person()
组合模式:构造函数模式+原型模式
构造函数中放实例私有的属性,
构造函数原型对象中放共有属性和方法
function Person(name, age, gender) {
this.name = name;
this.age = age;
this.gender = gender;
this.firends = ['zhangsan', 'lisi'];
}
Person.prototype = {
constructor: Person,
sayName: function () {
console.log(this.name);
}
};
var p1 = new Person('larry', 44, 'male');
var p2 = new Person('terry', 39, 'male');
p1.firends.push('robin');
console.log(p1.firends); // [ 'zhangsan', 'lisi', 'robin' ]
console.log(p2.firends); // [ 'zhangsan', 'lisi' ]
console.log(p1.firends === p2.firends); // false
console.log(p1.sayName === p2.sayName); // true