欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

JavaScript第五章对象

程序员文章站 2022-07-12 17:50:00
...

一、面向对象的概述
面向对象的特征: 封装性、继承性、多态性。

二、自定义对象
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不仅可以用来保存对象,还可以保存数字、字符串、数组等其他类型的数据。JavaScript第五章对象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): 是指将一个目标数据复制一份,形成两个个体。
深拷贝: 参与拷贝的两个目标,改变其中一个目标的值,不会影响另一个目标的值。
浅拷贝: 参与拷贝的两个目标,一个目标的值改变,另一个目标的值也会随之改变。
实现深拷贝
基本类型(如数值、字符型):通过变量赋值即可实现。
引用类型(如数组、对象):复制对象里的成员到另一个对象。
实现浅拷贝
引用类型(如数组、对象):通过变量赋值即可实现。
提示:浅拷贝是引用类型中才有的概念。
浅拷贝的优势
节省内存
JavaScript第五章对象
三、构造函数
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对象
JavaScript第五章对象
注意: 位置是一个索引值,从0开始计算,第一个字符的索引值是0,最后一个字符的索引值是字符串的长度减1。

2.Number对象
Number对象用于处理整数、浮点数等数值
JavaScript第五章对象

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对象用于对数值进行数学运算,与其他对象不同的是,该对象不是一个构造函数,不需要实例化就能使用
JavaScript第五章对象