一、对象
1、对象的简介
JS中数据类型: number数值 、string 字符串、 boolean 布尔值、 null 空值、undefined 未 定义 以上五种属于基本数据类型,只要不是以上五种都是对象
Object 对象
* 基本数据类型都是单一的值
* 值和值之间没有任何关系
* 在js中表示一个人的信息(name gender age)
* var name = "s";
* var gender=“男”;
* var age =10;
* 如果使用基本数据类型创建的变量都没有联系
* 对象属于一种复合的数据类型,在对象中可以保存多个不同数据类型的属性
2、对象的分类
1、内建对象
在ES标准定义的对象,在任何ES的实战中都可以使用
比如number、math、Boolean......
2、宿主对象
由js的运行环境提供的对象,主要指由浏览器提供的对象
比如BOM、DOM
3、自定义对象
由开发人员自己创建的对象
3、对象的基本操作
1、创建对象
创建对象
1、 使用new关键字调用的函数时是构造函数constructor
构造函数是专门用来创建对象的函数
使用typeof检查返回object
var obj=new Object();
2、使用对象字面量创建一个对象
使用对象字面量可以在创建对象时指定对象中的属性
语法 {属性名:属性值,属性名:属性值......}
对象字面量的属性名可以加引号也可以不加,建议不加
如果使用一些特殊的名字必须加引号
属性名和属性值是一组一组对应
名和值之间用 : 连接
多个名值之间使用逗号
如果一个属性后没有就不用写
var obj2={ name:"猪八戒", age:28, test:{name:"沙和尚"} }; console.log(obj2.test);
3、 使用工厂方法创建对象
通过该方法可以大批量的创建对象
function createperson(name,age,gender){ //创建一个新对象 var obj = new Object(); //向对象中添加属性 obj.name=name; obj.age=age; obj.gender=gender; obj.say=function(){ alert(this.name); } //将新的对象返回 return obj; }; var obj2=createperson("姜云升",26,"男");
4、使用构造函数来创建对象
创建一个构造函数,专门用来创造Person对象
构造函数执行流程
1、调用构造函数会立刻创建一个新对象
2、将新建的对象设置为函数中的this
3、逐行执行函数中的代码
4、将新建对象作为返回值返回
function Obj(参数a1,参数a2){ this.属性一=参数a1; this.属性二=参数a2; this.method=function(){ ... } } var obj1=new Obj(参数,参数) var obj2=new Obj(参数,参数)
5、使用原型prototype构造函数创建对象
function Obj(参数a1,参数a2){ this.属性一=参数a1; this.属性二=参数a2; } Obj.prototype.method=function(){ ... } var obj1=new Obj(参数,参数) var obj2=new Obj(参数,参数)
2、为对象添加属性
属性:在对象中保存的值称为属性
向对象中添加属性
语法: 对象.属性名=属性值;
//向obj中添加一个name属性
obj.name="孙悟空";
//向obj中添加gender属性
obj.gender="男";
3、修改对象中的属性值
读取对象中的属性
语法:对象.属性名
若读取对象中没有的属性不会报错会返回undefined
修改对象中的属性值
语法: 对象.属性名=新属性值;
4、删除属性
删除对象中的属性
语法: delete 对象.属性名;
delete obj.age;
4、原型对象
我们所创建的每一个函数,解析器都会向函数中添加一个属性prototype, 这个属性对应着一个对象,这个对象就是我们所谓的原型对象
如果函数作为普通函数调用prototype没有任何作用
当函数通过构造函数调用时,它所创建的对象中都会有一个隐含的属性指向该构造函数的原型
我们可以通过__proto__来访问该属性
原型对象相当于一个公共的区域
所有同一个类的实例都可以访问到这个原型对象
我们可以将对象中公用的内容统一设置到原型对象中
当我们访问对象的一个属性或方法时会先在对象自身中寻找
如果有直接使用,如果没有则会在原型对象中寻找
以后我们创建构造函数时可以将这些对象共有的属性和方法统一添加到构造函数的原型对 象中,这样不用分别为每一个对象添加,也不会影响到全局作用域,就可以使每个对象同 时具有这些属性和方法了
function Myclass(){ } //向Myclass的原型中添加属性a Myclass.prototype.a=123; //向Myclass的原型中添加一个方法 Myclass.prototype.say=function(){ alert("hello"); };
原型对象也是对象,所以它也有原型
当我们使用一个对象的属性和方法时,会在自身中寻找,自身中如果有,则直接使用
如果没有则去原型对象中寻找,如果原型对象中有则使用
如果没有则去原型的原型中寻找,直到找到object的原型
如果object中依然没有则返回undefined
小知识:使用in可以检查对象中是否有某个属性
若对象中没有但是原型中有也返回true
hasOwnProperty()来检查对象自身是否含有该属性
使用该方法只有对象自身含有属性时返回true
二、函数
1、函数的简介
函数 function, 函数也是一个对象。 函数中可以封装一些功能(代码),在需要时可以执行这些功能(代码),函数中可以保存一些代码在需要的时候调用。
创建函数的方式
1、创建一个函数对象,可以将要封装的代码以字符串的形式传递给构造函数
var fun = new Function("console.log("Hello,这是我的第一串代码")");
console.log(fun);
封装到函数的代码不会立即执行
函数中的代码会在函数调用的时候执行
调用语法: 函数对象()
当调用函数时候函数中的代码会按照顺序执行
fun();
注:开发中很少用
2、使用函数声明创建函数
语法 function 函数名([形参1,形参2,.....]){
语句
}
注: [ ]表示里面内容可写可不写
function fun2(){ console.log("如日之升"); alert("hhh"); } //调用函数 fun2();
3、使用函数表达式来创建一个函数
var 函数名 = function([形参1,形参2,.....]){
语句
}
var fun3=function(){ console.log("我是匿名函数中的代码"); }; //调用 fun3();
2、函数的参数与返回值
1、函数的参数
可以在函数的()指定一个或多个形参(形式参数),多个参数间用 , 隔开,但是不赋值
在调用函数时可以指定实参, 实参会赋值给对应形参
注:调用函数时解析器不会检查实参的类型
注意是否有可能接收非法参数
若有可能需要检查
调用函数时解析器不会检查实参的数量
多余的实参不会被赋值
如果实参数量少于形参则未赋值的会定义为undefined
2、函数的返回值
可以使用return来设置函数的返回值
语法: return 值
return后的值会作为函数结果返回
可以定义一个变量来接收该结果
在函数中return后的语句都不会执行
如果return后不跟值就相当于undefined
如果函数中不写return 也是undefined
return后可以跟任意类型的值
变量result的值就是函数的执行结果
立即执行函数
// 函数对象()
/*
* 定义后就执行
* 立即执行函数,只会执行一次
*/
(function(){
alert("nm");
})();
3、方法
函数也可以成为对象的属性值保存,那么我们称这个函数时这个对象的方法,调用函数时就说调用对象的方法,但是这是名称上的区别。
var obj=new Object();
//向对象中添加属性
obj.name="孙悟空";
obj.age=18;
//对象的属性值可以是任何的数据类型,也可以是函数
obj.say=function(){
console.log(obj.name);
};
function fun(){
console.log(obj.name);
}
// console.log(obj.say)
//调方法
obj.say();
//调函数
//fun();
4、作用域
作用域指一个变量作用的范围,在js中有两种作用域:1、全局作用域 2、函数作用域
1、全局作用域
直接编写在script标签的js代码,都在全局,全局作用域在页面打开是时创建页面关闭时销毁。
在全局作用域中有一个全局对象window,它代表浏览器的窗口,它由浏览器创建。我们可以直接使用。在全局作用域中, 我们创建的变量都会作为window对象的属性保存, 创建的函数都会作为window的方法保存, 全局作用域中的变量都是全局变量, 在页面的任意部分都可以访问的到。
var a=12;
// console.log(window.a);//存在
function fun(){
console.log("w");
}
window.fun();
特别:变量的声明提前
使用var关键字声明的变量会在所有的代码执行前声明好,但是不会赋值
但是如果声明变量不使用var则不会声明提前
函数的声明
使用函数声明形式创建的函数,它会在所有代码执行前声明,所有我们可以在函数声 明前调用函数
使用函数表达式创建的函数,不会被声明提前,所以不能在声明前调用
fun(); //函数声明会被提前创建 function fun(){ console.log("fun"); } //函数表达式不会提前创建 var fun2=function(){ console.log("fun2"); }
2、函数作用域
调用函数时创建函数作用域,函数执行完毕后,函数作用域销毁,每创建一个函数就会创建一个新的函数作用域,他们之间是相互独立的。函数作用域中可以访问到全局作用域的变量,全局作用域中无法访问函数作用域。
当在函数作用域中操作一个变量时,它会先在自身作用域中寻找, 如果有就直接使用,如果没有就向上一级寻找, 如果全局作用域中没有则会报错。在函数中想访问全局作用域则加window。
/*
* 在函数作用域也有声明提前的特性
* 使用var声明的变量会在函数中所有代码执行前声明
*/
function fun3(){
fun4();
var a=35;
function fun4(){
alert("我是fun4");
}
}
// fun3();
var c=33;
function fun5(){
console.log(c);
/*
* 在函数中不用var声明的c都会变成全局变量
*/
c=10;
}
fun5();
var e=23;
/*
* 定义形参就相当于在函数作用域中声明了变量
*/
function fun6(e){
alert(e);
}
fun6();