JavaScript同Java一样,也具有面向对象的特征。
面向对象的特征有封装性,继承性,和多态性。
有关多态性的直观体现之一:
var obj = 123;
console.log(obj.toString()); // 输出结果:123
obj = [1,2,3];
console.log(obj.toString()); // 输出结果:1,2,3
obj = function(){};
console.log(obj.toString()); // 输出结果:function(){}
自定义对象(字面量法)
定义
语法:对象的定义是通过“{}”语法实现的。
组成:对象以对象成员(属性和方法)构成,多个成员之间使用逗号分隔。
成员:对象的成员以键值对的形式存放在{}中。
建议先看这个,再看上面三行定义:
以下定义了四个对象:(空对象也是对象)
var o1 = {};
var o3 = {name:'Jim',age:19,gender:'男'};
var o2 = {name:'Jim'};
var o4 = {
name:'Jim',
age:19,
gender:'男',
sayHello:function(){console.log('你好');}
};
访问对象的成员
对象[变量名]=值;
var o6 = {}; // 创建一个空对象
var key = 'id'; // 通过变量保存要操作的属性名
o6[key] = 123; // 相当于“o6['id']=123”或“o6.id=123”
若该成员为方法(假设其名为say),则如此调用:
obj.say();
obj['say']();
成员对象的遍历
var obj = {name:'Tom',age:16};
for(var k in obj)
{
console.log(k + ': '+ obj[k]);
}
判断对象是否存在
var obj = {name:'Tom',age:16};
console.log('name' in obj); // 输出结果:true
console.log('gender' in obj); // 输出结果:false
构造函数自定义对象
字面量法只可定义一个对象,当多个对象具有相同的特征(成员)时,使用字面量法会造成代码冗余,繁杂。构造函数法解决了这一问题。这种定义方法更像Java中常用的定义方法。
function Stu(id,name,stature,weigth)
{
this.id = id;
this.name = name;
this.stature = stature;
this.weigth = weigth;
this.sayHobby = function(){document.writeln("看海豚");}
}
var stu0 = new Stu(001,"KujoJotaro",190,80);
注意:实例对象不能访问静态成员变量(啊?什么意思啊?)
(注意看下方对象中的id成员与其它成员的区别)
function Stu(id,name,stature,weigth)
{
var id = id;
this.name = name;
this.stature = stature;
this.weigth = weigth;
this.sayHobby = function(){document.writeln("看海豚");}
}
var stu0 = new Stu(1,"KujoJotaro",190,80);
document.write(stu0.id);// 输出为undefined(未定义)
除了上面代码中不用this.而用var的方法定义静态成员外,还可使用如下方法定义(添加)静态成员:
Stu.class = 114514; // Stu就是上面代码中的Stu对象函数
使用Object对象自定义对象
var stu = new Object();
// 直接添加,不用声明
stu.name = "KujoJotaro";
stu.id = 114514;
stu.sayHobby = function(){document.write("喜欢海豚");}
当然,构造函数法与Object对象法创建的对象与字面量法创建的都是对象,访问方式没有差别。
内置对象
内置对象有String对象,Number对象,Math对象,Data对象等。
String对象
String对象中的成员有:
成员 | 备注 |
---|---|
length | 获取字符串的长度 |
charAt(index) | 获取index位置的字符,位置从0开始计算 |
indexOf(searchValue) | 获取searchValue在字符串中首次出现的位置,不存在则返回-1 |
lastIndexOf(searchValue) | 获取searchValue在字符串中最后出现的位置 |
substring([start,end]) | 截取从start位置到end位置之间的一个子字符串 |
substr([start,length]) | 截取从start位置开始到length长度的子字符串 |
toLowerCase() | 获取字符串的小写形式 |
toUpperCase() | 获取字符串的大写形式 |
split([separator,limit]) | 使用separator分隔符将字符串分隔成数组,limit用于限制数量 |
replace(str1,str2) | 使用str2替换字符串中的str1,返回替换结果 |
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
Math对象
Math对象用于对数值进行数学运算,与其他对象不同的是,该对象不是一个构造函数,不需要实例化就能使用:
成员 | 备注 |
---|---|
PI | 获取圆周率,结果为3.141592653589793 |
abs(x) | 获取x的绝对值,可传入普通数值或是用字符串表示的数值 |
max(value1,value2,...) | 获取所有参数中的最大值 |
min(value1,value2,...) | 获取所有参数中的最小值 |
pow(base,exponent) | 获取基数(base)的指数(exponent)次幂,即base^exponent |
sqrt(x) | 获取x的平方根 |
ceil(x) | 获取大于或等于x的最小整数,即向上取整 |
floor(x) | 获取小于或等于x的最大整数,即向下取整 |
round(x) | 获取x的四舍五入后的整数值 |
random() | 获取大于或等于0.0且小于1.0的随机值 |
其中random对象很有趣,举个例子,如想生成1~100间的数字,则:
document.write(Math.random() * 99 + 1);
Data对象
Date对象用于处理日期和时间。
示例1:根据Date对象获取时间日期。
var date = new Date();//基于当前时间创建Date对象
//结果长得类似这样:Fri Oct 06 2017 11:53:04 GMT+0800(中国标准时间)
date.toString(); // 转成字符串后可用Data对象的成员进行处理
date.getFullYear();//示例结果:2017
date.getMonth();//示例结果:9
date.getDate();//示例结果:6
示例2:根据Date对象指定一个日期。
//方式1:分别传入年、月、日、时、分、秒(月的范围是0~11,即真实月份-1)
var date1 = newDate(2017,9,1,11,53,4);
date1.toString();//返回结果:SunOct01201711:53:04GMT+0800(中国标准时间)
//方式2:通过字符串传入日期和时间
var date2 = newDate('2017-10-0111:53:04');
date2.toString();//返回结果:SunOct01201711:53:04GMT+0800(中国标准时间)
Data对象的成员有:
(太多了不想写,参考这篇👇)
JSON
JSON 全称为JavaScript Object Notation(JavaScript 对象表示法)
JSON不仅可以用来保存对象,还可以保存数字、字符串、数组等其他类型的数据。
格式如下:
{"name":"Tom","age":24,"work":true,"arr":[1,2]}
或者
[{"name":"Tom","age":24},{"name":"Jim","age":25}]