JS笔记(六)对象
要理解:
面向过程
面向对象
对象
创建对象的不同方式
自定义对象
数据类型深入
简单的类型和复杂的类型
内置对象
1、面向对象:可以创建自定义的类型
面向对象特性:封装、继承(类)、多态(抽象性),比如JAVA
JS不是面向对象语言,但可模拟面向对象的思想
JS是一门基于对象的语言,里面有对象
2、对象:
对象:就是看得见,摸得到的某个东西
找对象:班主任不是对象,因为这是一类。我们班的班主任是对象。
对象概念:Js中就是一组无序的属性的集合
对象的特点:有特征(属性)和行为(方法)
总结对象:有特征和行为,具体指的某一事物,“一组无序属性的集合的键值对“
(有属性和方法,具体特指某个事物)
属性是键值对:属性名:值;//对象的属性值可以是任何类型的数据,也可以是函数
如person.sex='女';
3、创建对象:
三种方式:
(1)调用系统的构造函数创建对象
var 变量名 = new object();
//实例化对象:
var obj = new Object();
//添加属性:
obj.name = "小苏"
obj.age = 18;
//添加方法:
obj.eat = function(){
console.log("我喜欢吃蛋糕");
};
obj.play= function(){
console.log("我喜欢玩游戏");
};
//调用:
console.log(obj.name);
一次性创建多个对象?把创建对象的代码封装在一个函数中
function createObject(name,age){
var obj = new Object();
obj.name = name;
obj.age = age;
obj.sayHi= function(){
console.log("我叫:" + this.name + "我今年" + this.age + "岁");
};
return obj;
}
var per1 = createObject("小苏","20");
per1.sayHi();
(2)自定义构造函数创建对象(结合第一种和需求通过工厂模式创建对象)
(原本是系统的new Object();)
函数和构造函数的区别:
1)首字母是大写的,是构造函数,为了创建对象。普通函数首字母小写,驼峰命名;
2)调用方式不同,普通函数xx();即可,构造函数var xx = new xx();
3)构造函数名和类名相同,也都是xx;
4)构造函数内部用this来构造属性和方法:this.name=name; this.sayHi=function(){}
自定义构造函数过程:
function Person(name,age){
this.name=name;
this.age=age;
this.sayHi=function(){
console.log("我叫:" + this.name + "年龄是" + this.age);
}
}
var obj = new Person("小明",20);
console.log(obj.name);
obj.sayHi();
------在java中
------new一个对象:PersonDemo PD = new PersonDemo(); //PersonDemo()在代码中可找到对应PersonDemo类
------PersonDemo PD就是在内存中分配一个变量,名字是PD,这个变量是PersonDemo类型
------new PersonDemo(); 是new这个关键字和PersonDemo()这个构造方法来创建一个对象,new这个PersonDemo类的一个对象。程序运行,会调用构造方法PersonDemo(),执行完毕,PersonDemo类型的对象PD就构造出来了,出现在内存当中。会把这个内存地址返回,赋值给PD,PD就是引用变量,或者叫变量,PD的值就是一个地址,在内存中东西就是对象/实例。
5)当创建对象时,var obj = new Person("小明",20); 发生了四件事
一、在内存中开辟(申请一块空闲的空间)空间,存储创建的新的对象;
二、把this设置为当前对象;
三、设置对象的属性和方法;
四、把this这个对象返回;
6)普通函数和构造函数的返回值:
function person(){ }
var per = new persopn();
console.log(per); //没有返回值,返回undefined
function Person(){ }
var per = new Person();
console.log(per); //返回[object,object],构造函数会马上创建一个新对象,并将他作为返回值返回
7)对象创建的内存图:
8)用instanceof检查一个对象是否是一个类的实例,是则返回true;
coonsole.log(per instanceof Person);
如:console.log(Array instanceof Object); //Array 系统的对象,返回true
(3)字面量的方式创建对象
var obj = {}; // 这是一个空对象
obj.name = "小苏";
obj.age = 20;
obj.sayHi= function() {
console.log("我是" + obj.name);
}
obj.sayHi();
优化:
var obj = {
name: "小苏",
age: 20,
sayHi: function() {
console.log("我是" + obj.name);
}
};
obj.sayHi();
缺陷:一次性的对象,后面可以在函数外更改obj.name = "小小苏"
--->点语法:对象.名字=值;对象.名字=函数;
4、访问属性的另一种方法:
function Person(name,age){
this.name=name;
this.age=age;
this.sayHi=function(){
console.log("我叫:" + this.name + "年龄是" + this.age);
}
}
var obj = new Person("小明",20);
console.log(obj.name);
obj.sayHi();
另一种:obj["name"] = "佐助"; console.log(obj["name"]);
或者:obj.["sayHi"]();
5、Json格式数据及遍历:
(一般都是成对的,是键值对:name:"小苏")
json是个对象,数据都是成对的,一般json格式的数据无论键还是值都是用双引号括起来的
对象设置属性的值的写法:
对象.属性名字 = 值;-----点语法
对象["属性的名字"] = 值;
遍历:不能通过for循环,因为是无序结构的
用for-in循环
var json = {"name":"小苏", "age":"10"};
for(var key in json){ //key是一个变量,这个变量中存储的是该对象所有属性的名字
console.log( key ); //json对象中的属性的名字
console.log( json[key] ); //每个的值
}
6、简单类型和复杂类型:
原始数据类型:number,string,boolean,undefined,null,object
基本数据类型(值类型):String、Number、Boolean、Null、Undefined
引用数据类型(引用类型):Object对象
空类型:undefined,null
(1)值类型的值在哪一块空间中存储?
存储在栈内存中,值与值之间单独存在
(2)引用类型的值哪一块空间中存储?
地址在栈内存存储,对象在堆内存存储,每创建一个对象,会在堆内存中开辟新空间,变量保存的是对象的内存地址(即对象的引用),对象的值是保存在堆内存中的,而对象的引用(即变量)是保存在栈内存中。
7、值类型和引用类型传递:
(1)值类型传递的是值:
例1:
var num = 10;
var num2 = num; //把num的值传递给num2,num的栈中一样放着10
例2:
function f1(x){
x = 100;
}
var num = 10;
f1(num);
console.log(num); //10
例3:
var num1 = 10;
var num2 = num1;
num1 = 20;
console.log(num1); //20
console.log(num2); //10
(2)引用类型传递的是地址(引用):
例4:
var obj ={
name:"小明"
}
function f2(obj2){
obj2.name="小红";
console.log(obj.name); //小红
}
console.log(obj.name); //小明
f2(obj);
console.log(obj.name); //小红
注:如果希望两个变量之间不受影响,可以用Object.assign()来复制对象。
var obj3 = Object.assign({}, obj1);
例5:
var num = 50;
function f1(num){
num = 60;
console.log(num); //60
}
f1(num);
console.log(num); //50
例6:
var num1 = 55;
var num2 = 66;
function f1(num,num1){
num = 100; //外边的num1
num1 = 100; //外边的num2
num2 = 100; //隐式全局变量
console.log(num); //100
console.log(num1); //100
console.log(num2); //100
}
//num2 = 100; 函数运行完num2出现
f1(num1,num2);
console.log(num1 + "num1"); //55
console.log(num2 + "num2"); //100 , 隐式全局变量
console.log(num + "num"); //undefined,局部变量
例7:
function Person(name,age,salary){
this.name = name;
this.age = age;
this.salary = salary;
}
function f1(person){
person.name = "ls";
}
var p = new Person("zs",188,1000); //创建p对象
console.log(p.name); //zs
f1(p);
console.log(p.name); //ls
function Person(name,age,salary){
this.name = name;
this.age = age;
this.salary = salary;
}
function f1(person){
person.name = "ls";
person = new Person("aa",18,10); //重新开堆
}
var p = new Person("zs",188,1000);
console.log(p.name); //zs
f1(p);
console.log(p.name); //ls