对象概述
1.JavaScript中,除了string,number,boolean,null,undefined,其他数据都是对象,甚至包括数组、日期和函数。
2.ECMA-262定义:对象是属性的无序集合,每个属性存放一个原始值、对象或函数,对象是无特定顺序的值的数组
3.对象是一种特殊的数据类型可以包含多个成员,其中分为两种:属性和方法:
属性即封装对象的数据,表示与对象有关的值,用法即对象名.属性名
方法即封装对象的行为,表示对象可以执行的行为或可完成的功能,用法即对象名.方法名();
对象的分类
1.内置对象/原生对象,指JavaScript中本身预定义的对象,由ECMAScript标准定义,由各浏览器厂家来提供实现,如下:
String,Number,Boolean
Object,Function
Array,Date,RegExp,Math
Error,EvalError,RangeError,ReferenceError,SyntaxError,TypeError,URIError
Global
2.宿主对象(host object) ,指JavaScript运行环境即浏览器提供的对象,由浏览器厂家自定义,具体分为两大类:
1).BOM
2).DOM
3.自定义对象,由用户创建的对象,创建方法如下:
1).对象直接量
由名值对组成的映射表,名值对之间以逗号隔开,名和值之间以冒号隔开,如:
var obj={name:"Horry",age:23}
2).new Object(); 如以下方式:
-利用内置对象,使用new关键字 var obj=new Date();
-添加属性 var obj=new Object(); boj.name="John";obj.age="23";
-若构造方法没有参数,则可以省略()
3).function对象模板
使用function模板批量创建某种类型的多个实例且具备相同的基础属性
利用模板定义对象的属性,对象模板中使用this关键字声明对象的属性
利用模板定义对象的方法,对象模板中使用this关键字声明对象的方法
重写方法,以tostring()方法为例
JavaScript中,this关键字用在方法内,专门引用正在被调用的方法当前所在的对象
对象的属性
一个对象可以声明若干个属性
通过对象的引用、使用. 或[]运算符来访问对象的属性
遍历属性,通过for...in循环遍历对象内的所有属性
属性访问错误
若读取一个本身就不存在的属性,以及属性值是undefined的属性,那么返回值也是undefined
检测属性是否存在:
1.使用in关键字 :console.log("ename" in emp1);
2.使用对象的hasOwnProperty();方法 :console.log(emp1.hasOwnProperty("ename"));
3.使用undefined判断 :console.log(emp1.ename === undefined);
4.在条件语句中直接判断,如if(emp1.ename){...}
对象的方法
方法即指对象可以实施的行为或完成的功能
方法的调用一般通过对象的引用来调用,比如emp1.ename="Harry"
JavaScript 面向对象(oop)
oop即面向对象的语言,有三大特点:
1.封装
——把相关的信息(无论数据或方法)存储在对象中
2.继承
——从其他对象获得属性和方法
3.多态
——能以多种不同的形式运行函数或方法
原型与继承
1.原型:
在JavaScript中,函数本身也是一个包含了方法和属性的对象,每个函数都有prototype属性,该属性引用的就是原型对象。
原型对象是保存共享属性值和共享方法的对象,同时JavaScript并没有规定一个函数的原型类型,因此原型可以是任何类型
2.内存图描述:
3.删除属性
可以使用delete关键字删除,如: delete emp1.ename; delete emp1.prototype.age;
4.自有属性与原型属性
1).自有属性:通过对象的引用添加的属性,其他对象即使有此属性,也是相互独立的;
2).原型属性:从原型对象中继承来的属性,一旦原型对象中属性值改变,所有继承自该原型的对象属性均改变
3).自有属性覆盖(重写)原型属性。
4).检测:
①使用hasOwnProperty()检测对象是否具备指定自有属性;
②使用in检测对象及其原型链中是否具备指定属性。
5.对象的prototype属性
1).自定义对象的prototype属性:
-new创建的对象,使用其构造函数的prototype作为原型
-对象直接量的原型为:Object.prototype
2).内置对象的prototype属性,如:Array对象,Boolean对象,Date对象,String对象,Number对象。
6.获取原型
获取原型,进而可实现共享属性的两种方法:
1).使用构造函数的prototype属性
2).使用专门的getPrototypeOf()方法
7.原型链
在JavaScript中,原型对象本身也有原型,构造函数的原型对象中也有一个_proto_属性,默认指向Object类型的原型对象
Object.prototype是所有对象的原型,其中包括了所有对象共有的属性和方法,如tostring();
事实上,所有对象通过_proto_属性的引用关系,都可以直接或间接的引用到Object.prototype对象;
我们将使用对象的_proto_属性,形成逐级引用的关系,称为原型链。
- 内存图描述
继承
1.继承的实现方式:
通过原型实现继承有以下两种方式:
1).修改构造函数的原型,为该构造函数创建的对象指定统一的父级对象。语法:构造函数.prototype=父级对象;
注意:1.修改原型后,用此构造函数创建的新对象,均引用新原型。
2.修改原型之前,用此构造函数创建的对象,将无法使用新原型,依然使用旧原型,因此被孤立。
2).单独修改一个对象的原型,而不影响其他对象的原型,语法:Object.setPrototypeOf(子对象,父对象);
2.检查对象的原型
isPrototypeOf()用于判断一个prototype对象是否存在于另一个对象的原型链中,如果是返回true,否则false。
3.只继承于原型
——出现效率的考虑,应尽可能的把可重用的属性和方法添加到原型中去
1).不要单独为继承关系创建新对象;
2).尽量减少运行时的方法搜索,如tostring()
4.继承与扩展
JavaScript中的继承基于prototype,而不是基于类。