对象(Object)是什么?
在软件系统中,对象具有唯一的标识符,对象包括属性(Properties)和方法(Methods),属性就是需要记忆的信息,方法就是对象能够提供的服务。在面向对象(Object Oriented)的软件中,对象(Object)是某一个类(Class)的实例(Instance)。 —— 维基百科
面向对象语言的特点:有类(class)的概念,如C++、Java。
Javascript没有类的概念,基于原型,支持面向对象。
基本数据类型
string
、number
、boolean
、null
、undefined
null
、undefined
分别表示没有声明和声明后没有初始化的变量、对象,是两个简单的值,其余三个有对应的包装对象Number
、Boolean
、String
面向对象三大特性
封装
封装就是把过程和数据封闭起来,对数据的访问只能通过开放的接口
作用:方便维护,提高代码的复用性,信息隐蔽继承
子类对象继成使用父亲的属性和方法多态
多态是指两个或多个属于不同类的对象,对于同一个消息(方法调用)做出不同响应的方式
Javascript天生就具备多态的特性(弱类型语言)
创建对象
字面量式声明对象
使用场景:只需要简单的创建几个对象
123var obj = {name : 'object'};问题:在创建同类型的代码时存在大量重复代码
使用内置的构造函数
系统内置的构造函数:
Object
、Array
、Date
、Function
等123var obj = new Object();obj.name = 'object';//等价于 var obj = {};问题:复用性不好,存在大量冗余重复代码,与字面量方式类似
简单的工厂的函数
封装:把固定部分写在函数体中,不同的作为函数的参数传递进去
1234567891011//// 01提供函数(工厂函数)封装对象的创建过程function creat(name) {//创建一个空的对象var obj = new Object();//设置属性和方法obj.name = name;//返回对象return obj;}//创建对象var newObj = creat('objName');问题:创建不同类型对象时,无法识别对象
自定义构造函数创建对象
- 提供一个构造函数
- 通过
this
设置属性和方法 使用
new
构造函数创建对象12345678910111213function Person(name, age) {/* 默认会创建一个新的对象var obj = new Object();默认会把新创建的对象赋值给thisthis = obj; */this.name = name;this.age = age;/*默认会返回新创建的对象return this;*/}var p1 = new Person('张三', 20);问题:破坏封装性,结构性不好,全局变量污染。创建多个对象时,内部属性方法一样,每次都会开辟一块新的内存空间,造成浪费
解决办法:通过原型属性和方法
判断对象的类型
instanceof
:判断某一变量是否为一个对象的实例
用法:判断a是否是A的一个实例,a instanceof A;
返回booleanisPropertyOf
:判断一个对象是否是指定对象的原型对象
用法:判断object是否是obj的原型对象,object.isPropertyOf(obj);
返回booleanconstructor
:构造器属性,获取对象是由哪一个构造函数所创建的
用法:获得实例对象a的构造函数a.constructor;
返回a的构造函数