对象
概述:
ECMA-262把对象定义为:属性的无序集合,为每个属性存放一个原始值、对象或函数,即对象是无特定顺序的值的数组。
通用定义:对象是需求场景中的名词(人,事,物)在程序中的表示。Javascript中除了string,number,boolean,null,undefined之外,其他的数据都是对象,如数组,日期,函数等。
Javascript是面向对象的语言,但与Java,c#等面向对象的语言不通,JS中没有定义类的语法,也不会通过类来创建对象——javascript基于prototype,而不是基于类。
一种面向对象语言需要向开发者提供三种基本能力:
封装——把相关信息(无论数据或方法)存储在对象中的能力
继承——从其他对象为当前对象获取属性和方法的能力
多态——能以多种不同的形式运行函数或方法的能力
ECMAScript中,一个对象可由多个特性(attribute)构成(也称为对象的成员);
每个特性都有名称和值;
若特性的值存放的是原始值或对象的引用,这种特性称为对象的属性(property)——属性描述对象的名词性特征;
若特性的值存放的是函数,这种特性称为对象的方法(method)——方法描述对象的动词性特征;
Object = Property + Method
创建对象
创建对象共有三种方式:
- 对象直接量
var emp1={enname:"tom",salary:5000};
var book={
bookname:"javascript高级编程",
'subtitle':"深入javascript",
'for':"有一定编程基础的人员",
author:{
firstname:'ming',
lastname:'wang'
}
};
console.log(emp1.enname);
console.log(emp1.salary);
- 通过new 关键字调用构造方法创建对象
var emp2=new Object();
emp2.enname="Mary";
emp2["salary"]="6000";
- 通过Object.create(prototype)创建对象——ECMAScript5新增的方法。
访问属性
有多种访问方法,但如果写[]要在里面加""
console.log(book.bookname);
console.log(book.author.firstname);
console.log(book['author']['firstname']);
使用for/in 循环遍历对象的所有属性
for…in 遍历对象的属性并没有特定的顺序;只能遍历出用户自定义的属性,不能枚举出预定义的属性和方法。
for (var i in book){
document.write(i+":"+book[i]+"<br>");
}
检测属性
- 使用in关键字
console.log("bookname" in book);
- 使用对象的hasOwnProperty()方法
console.log(emp2.hasOwnProperty("enname"));
- 使用undefined判断
console.log(book.bookname==undefined);
- 在条件语句中判断
if(emp1.enname){ //undefined/null/0空字符串都会自动转换为false
console.log("ename属性存在");
}
JOSN(Javascript Object Notation)
Javascript对象表示法,原本是Javascript中创建对象的一种语法。
现在,Json已经从javascrip中独立出来,作为一种独立的字符串数据表示法,被java,c#,c++,php等几乎所有主流语言所支持。
Json作为一种轻量级的文本数据交换格式,已被广泛使用存储和交换文本数据领域,作用于xml类似,但比xml更简洁,更快,更容易解析。
Json语法是javascript对象表示语法的子集
- 数据在名称/值对中
- 数据由逗号分隔
- 花括号保存对象
- 方括号保存数组
Json数据的基本格式是:“名称/值”对 , “salary”:4000 名称应使用双引号引起来,值可以是一下类型:数字,字符串,逻辑值,数字,对象,null。
var json='{"x":50,"y":30}';
var jsonObj=eval("("+json+")");
console.log(jsonObj.x);
console.log(jsonObj.y);
console.log(typeof(jsonObj));
console.log(typeof(jsonObj.x));
使用JSON.parse(string)方法来解析JSON字符串得到javascript对象。
var jsonTxt = '{"x":60,"y":30}';
var jsonObj = JSON.parse(jsonTxt);
console.log(jsonObj.x);
console.log(jsonObj);
console.log(typeof(jsonObj));
使用JSON.stringify(jsonObj)方法把Javascript对象格式化为JSON字符串。
var jsonObj = {
'x':30,
'y':60
};
var jsonTxt = JSON.stringify(jsonObj);
console.log(jsonTxt);
console.log(typeof(jsonTxt));
arguments对象
- arguments属性是一个类数组对象,每个Function对象具有该属性
- arguments属性只有在函数执行体内才有效,从中可以对当前函数接收的所有实际参数
- 可以使用arguments属性处理可变数量的参数
- arguments对象具有如下属性:
- length: 返回实际传入的参数的个数
- callee: 返回当前函数的引用(匿名函数可以使用该属性实现递归调用)
面向对象
万物皆对象
Javascript是一种基于对象(object-based)的语言,你遇到的所有东西几乎都是对象。但是,它又不是一种真正的面向对象的编程(OOP)语言,因为它的语法中没有class类。
什么是面向对象?
你通过观察生活当中的实际存在的某一个事物,通过些许数据将整个实际存在的事物抽象到计算机当中存储起来。
面:你通过看
向:方向
对象:世间万物解释对象
抽象:使用计算机当中某些方法和属性
函数定义:
怎么定义Javascript当中的函数(三种定义方式)
第一种定义方式(一般方式,最简单,最直接)
function add(){
}
第二种定义方式(构造函数法,Javascript中没有类的概念,Fuction是一个对象)
var add=new Fuction();
第三种定义方式(直接量方式,定义变量接受)
var add=fuction(){
}
构造函数并实例化的书写步骤:
1.先构造一个对象(设置好参数的个数)。
2.根据参数的个数来书写该对象的属性 this指代构造的对象
3.书写该对象的方法
4.通过关键字 new来实例化该对象并传递与参数个数相同的值
5.将实例化后的对象赋给一个变量
6.输出该变量即可。
写构造的意义是什么?
将复杂重复属性的代码简洁化处理,让代码执行更加的快捷高效。
函数重载(arguments对象)
java当中函数重载(函数名相同,函数的参数个数不同)
eg:
public void add(String username,String password){
}
public void add(String username){
}
Javascript函数重载
fuction add(a,b){
return a+b;
}
function add(a,b,c){
return a+b+c;
}
console.log(add(1,2)); //output NaN
console.log(add(1,2,3)); //output 6
说明:
Javascript中没有真正意义上的函数重载。
函数重载
函数名相同,函数的参数列表不同(包括参数个数和参数类型),根据参数的不同去执行不同的操作。
几种特殊的函数
1.普通函数
function aDd(a,b){
return a+b;
}
2.匿名函数
function(a,b){
return a+b;
}
匿名函数的作用:
1.可以将匿名函数作为参数传递给其他函数,接收方就能够利用所传递的函数来完成某些特定的事情。
2.可以定义某个匿名函数来完成某一次性的任务。
3.回调函数
function fn(a,b){
return a()+b();
}
var one=function(){return 1;}
var two=function(){return 2;}
console.log(fn(one,two));
console.log(fn(function(){return 3;},function(){return 4;}))
one two 对于fn来说就是一个参数,函数one和two就是回调函数
将一个函数作为一个参数传递给另一个函数,作为参数的函数就是回调函数。
回调函数有助于提升性能
匿名回调函数的优点:
1.可以在不做命名的情况下传递函数(意味着可以节省全局变量)
2.可以将一个函数调用操作委托给另外一个函数(意味着可以节省一些代码编写工作)
4.自调函数
自调函数就是在定义函数后自行调用:
(function(){
console.log("javascript");
})();
1+(function(){
console.log("javascript");
})()
第一个括号:放置的是一个匿名函数。
第二个括号的作用:立即调用。
自调函数只需:将匿名函数放在第一对括号当中,然后再加一对括号即可。
注意: 在一个<script></script>标签中写多个自调函数的时候,一定要注意要不然就是在第二个()立即调用之后写上 ; 注意语法的规范
要不然就是在函数前写一个 1+ 要不然会出现报错的现象。
自调函数传递参数:
(function(str){
console.log(str)
})("朴宰范")
5.内部(私有)函数
在函数内部定义的函数。
function fn(){
var a="a"
function fn1(input){
var b="b";
return b;
}
return fn1();
}
console.log(fn()) // b
//console.log(fn1()) // undefined fn1 is not defined 内部函数的私有性,内部函数自定义不调用没意义
返回函数的函数,是内部私有函数的一种特殊用法:
function fnn(){
var a="a";
return function(){
return a;
}
}
console.log(fnn()); //output ƒ (){ return a}
var fun=fnn();
console.log(fun());//output a
console.log(fnn()()); //output a