JavaScript第五章对象
一、面向对象的概述
面向对象的特征: 封装性、继承性、多态性。
二、自定义对象
1.对象的定义
语法:通过 { } 实现。
组成:以对象成员(属性和方法)构成,多个成员之间使用逗号分割。
成员:以键值对的形式存放在 { } 中。
例:
var o1 = {};
var o2 = {name:'jim'};
var o3 = {name:'jim',age:19,gender:'男'};
var o4 = {
name:'jim',
age:19,
gender:'男',
sayHellow:function(){
console.log('你好');
}
};
※2.JSON数据格式
语法:JSON是一个字符串,使用双引号包裹对象的成员名和字符串型的值。
JSON与对象的区别:
1.JSON是一个字符串。
2.JSON不仅可以用来保存对象,还可以保存数字、字符串、数组等其他类型的数据。3.访问对象成员
①.语法:对象.成员。
var o5 = {}; // 创建一个空对象
o5.name = 'Jack'; // 为对象增加属性
o5.introduce = function () { // 为对象增加方法
alert('My name is ' + this.name); // 在方法中使用this代表当前对象
};
alert(o5.name); // 访问name属性,输出结果:Jack
o5.introduce(); // 调用introduce()方法,输出结果:My name is Jack
②.可变成员名语法:对象[变量名] = 值。
var o6 = {}; // 创建一个空对象
var key = 'id'; // 通过变量保存要操作的属性名
o6[key] = 123; // 相当于“o6['id'] = 123”或“o6.id = 123”
4.对象成员遍历
语法:for…in。
var obj = {name: 'Tom', age: 16}; //变量k保存了每个对象成员的名称。
for (var k in obj) { //obj[k]访问成员属性的值。
console.log(k + '-' + obj[k]); //obj[k]()调用成员方法。
}
※5.判断对象成员是否存在
当需要判断一个对象中的某个成员是否存在时,可以使用in运算符。
当对象的成员存在时返回true,不存在时返回false。
var obj = {name: 'Tom', age: 16};
console.log('name' in obj); // 输出结果:true
console.log('gender' in obj); // 输出结果:false
6.深拷贝和浅拷贝
拷贝(copy): 是指将一个目标数据复制一份,形成两个个体。
深拷贝: 参与拷贝的两个目标,改变其中一个目标的值,不会影响另一个目标的值。
浅拷贝: 参与拷贝的两个目标,一个目标的值改变,另一个目标的值也会随之改变。
实现深拷贝
基本类型(如数值、字符型):通过变量赋值即可实现。
引用类型(如数组、对象):复制对象里的成员到另一个对象。
实现浅拷贝
引用类型(如数组、对象):通过变量赋值即可实现。
提示:浅拷贝是引用类型中才有的概念。
浅拷贝的优势
节省内存
三、构造函数
1.创建方式
面向对象编程语言的实现模板的方式: 利用类(class)创建模板,根据模板实现不同的对象(类的实例)。
JavaScript实现模板的方式1: 通过工厂函数,在其内部通过字面量“{ }”的方式创建对象来实现,缺点是无法区分对象的类型。
JavaScript实现模板的方式2: 通过构造函数创建对象。
2.JavaScript内置的构造函数
常见的内置构造函数:Object、String、Number等构造函数。
构造函数如何创建对象:new 构造函数名()。
什么是实例化与实例:人们习惯将使用new关键字创建对象的过程称为实例化,实例化后得到的对象称为构造函数的实例。
// 通过构造函数创建对象
var obj = new Object(); // 创建Object对象
var str = new String('123'); // 创建String对象
// 查看对象是由哪个构造函数创建的
console.log(obj.constructor); // 输出结果:function Object() { [native code] }
console.log(str.constructor); // 输出结果:function String() { [native code] }
console.log({}.constructor); // 输出结果:function Object() { [native code] }
“对象.constructor”属性指向了该对象的构造函数。
通过console.log()输出时,[native code]表示该函数的代码是内置的。
3.自定义构造函数
构造函数的命名推荐采用帕斯卡命名规则,即所有的单词首字母大写。
在构造函数内部,使用this来表示刚刚创建的对象。
//自定义构造函数
function Person(name, age) {
this.name = name;
this.age = age;
this.sayHello = function () {
console.log('Hello, my name is ' + this.name);
};
}
//使用构造函数
var p1 = new Person('Jack', 18);
var p2 = new Person('Alice', 19);
console.log(p1);
console.log(p2);
p1.sayHello();
console.log(p1.constructor);
※.4.class关键字
class关键字的作用:用来定义一个类。
特点:在类中可以定义constructor构造方法。
5.私有成员
概念:在构造函数中,使用var关键字定义的变量称为私有成员。
特点:在实例对象后无法通过“对象.成员”的方式进行访问,但是私有成员可以在对象的成员方法中访问。
特性:私有成员name体现了面向对象的封装性。
function Person() {
var name = 'Jim';
this.getName = function () {
return name;
};
}
var p = new Person(); // 创建实例对象p
console.log(p.name); // 访问私有成员,输出结果:undefined
p.getName(); // 访问对外开放的成员,输出结果:Jim
※6.构造韩式中的return关键字
构造函数的本质是函数,因此构造函数中也可以使用return关键字。
构造函数在使用时与普通函数有一定的区别:
若用return返回一个数组或对象等引用类型数据,则构造函数直接返回该数据,而不会返回原来创建的对象。
若返回的是基本类型数据,则返回的数据无效,依然会返回原来创建的对象。
// 返回基本类型数据
function Person() {
obj = this;
return 123;
}
var p = new Person();
console.log(p === obj); // true
// 返回引用类型数据
function Person() {
obj = this;
return {};
}
var p = new Person();
console.log(p === obj); // false
7.函数中的this指向
this的特点:根据函数不同的调用方式,函数中的this指向会发生改变。
1.new关键字将函数作为构造函数调用时,构造函数内部的this指向新创建的对象。
2.直接通过函数名调用函数时,this指向全局对象(浏览器中表示window对象)。
3.如果将函数作为对象的方法调用,this将会指向该对象。
//分析this指向
function foo() {
return this;
}
var o = {name: 'Jim', func: foo};
console.log(foo() === window); // 输出结果:true 直接调用函数
console.log(o.func() === o); // 输出结果:true 作为对象的方法
//更改this指向
function method() {
console.log(this.name);
}
// 输出结果:张三
method.apply({name: '张三'});
// 输出结果:李四
method.call({name: '李四'});
function method(a, b) {
console.log(a + b);
}
// 数组方式传参,输出结果:12
method.apply({}, ['1', '2']);
// 参数方式传参,输出结果:34
method.call({}, '3', '4');
相同点:apply()和call()方法的第1个参数表示将this指向哪个对象。
不同点: apply()方法的第2个参数表示调用函数时传入的参数,通过数组的
形式传递; call()方法的第2~N个参数来表示调用函数时传入的函数。
※8.bind()方法
bind()方法的作用:用于在调用函数前指定this的含义,实现提前绑定的效果。
bind()方法的第1个参数:将this指向哪个对象。
bind()方法的第2~N个参数:表示调用函数时传入的函数。
function method(a, b) {
console.log(this.name + a + b);
}
var name = '张三';
var test = method.bind({name: '李四'}, '3', '4');
method('1', '2'); // 输出结果:张三12
test(); // 输出结果:李四34
四、内置对象
1.String对象
注意: 位置是一个索引值,从0开始计算,第一个字符的索引值是0,最后一个字符的索引值是字符串的长度减1。
2.Number对象
Number对象用于处理整数、浮点数等数值
var num = 12345.6789;
num.toFixed(); // 四舍五入,不包括小数部分,返回结果:12346
num.toFixed(1); // 四舍五入,保留1位小数,返回结果:12345.7
num.toFixed(6); // 用0填充不足的小数位,返回结果:12345.678900
Number.MAX_VALUE; // 获取最大值,返回结果:1.7976931348623157e+308
Number.MIN_VALUE; // 获取最小正值,返回结果:5e-324
3.Math对象
Math对象用于对数值进行数学运算,与其他对象不同的是,该对象不是一个构造函数,不需要实例化就能使用
下一篇: Java 计算两个日期之间相差天数