JS面向对象基础

本文最后更新于:1 年前

OOP(面向对象编程)基础

语言的分类:
1、面向机器:汇编语言
2、面向过程:C语言
3、面向对象:java、C++、PHP等
面向过程与面向对象区别:
面向过程:专注于如何去解决一个问题的过程,编程特点是用一个个函数去实现过程操作,没有类与对象的概念
面向对象:专注于由哪一个对象实体去解决这个问题,编程特点是出现了类,由类生成对象
面向对象的三大特征:继承、封装、多态

类和对象的关系

类:
一群有相同特征(属性)和行为(方法)的集合 ;

对象
从类中,拿出的具有确定属性值和方法(行为)的个体

类和对象的关系:
类是对象的抽象化,对象是类的具体化;类是抽象的,对象是具体的
通俗来说: 类是一个抽象概念,表示具有相同属性和行为的集合,但是类仅仅表明这类群体具有相同的属性,但是没有具体的属性值,而对象是对类的属性进行具体赋值后,而得到的一个具体的个体

使用类来创建对象

1、创建一个类(构造函数),类名必须每个单词的首字母大写

1
2
3
4
5
function 类名(属性1){
this.属性 = 属性1;
this.方法 = function(){};
//this 指向即将调用当前构造函数的对象
}

2、同过类实例化出一个新的对象:(实例化对象时会执行构造函数)
var obj = new 类名(属性1value);
原构造函数中this指向新创建的obj对象
obj.方法(); 调用方法
obj.属性(); 调用属性

两个重要的属性:
1、constructor:
返回当前对象的构造函数,(只有对象才有,返回的是构造函数-类)
zhangsan.constructor == Person true
对象的constructor,位于__proto__原型对象上
2、instanceof
用来测试一个对象在其原型链中是否存在一个构造函数的 prototype 属性。
object(要检测的对象).constructor(某个构造函数)

广义对象和狭义对象

狭义对象:只有属性、方法,除此之外没有任何东西
var obj = {}; var obj = new Object();
广义对象:除了用字面量声明的基本数据类型之外,换句话说,能够添加属性与方法的变量,就是对象;
var s = "1"; 不是对象, var s = new String("1"); 是对象

【成员属性与成员方法】
在构造函数中,通过”this.属性”声明,或者实例化出对象后,通过”对象.属性”追加的,都属于成员属性或成员方法,成员属性/方法,是属于实例化出的这个对象,通过”对象.属性”调用
【静态属性与静态方法】
通过”类名.属性名”,”类名.方法名”声明的变量,称为静态属性、静态方法,也叫类属性、类方法
成员属性是属于实例化出的对象的,会出现在新对象的属性上,类属性是属于构造函数自己的,不会出现在新对象属性上

JS中的对象

JS提供的内置对象有 array、boolean、number、string、date、math、regexp 。通常我们认为JavaScript的对象是键值对的容器。

虽然JavaScript 是面向对象的语言,但 JavaScript 不使用类。在 JavaScript 中,不会创建类,也不会通过类来创建对象(就像在其他面向对象的语言中那样)。
JavaScript 基于 prototype,而不是基于类的。

JS创建新对象有两种不同的方法:

  • 定义并创建对象的实例
  • 使用函数来定义对象,然后创建新的对象实例

直接创建对象实例

有两种方式直接创建对象,一种是使用字符通过键值对的方式创建:

1
2
3
4
5
6
7
8
var person = {
name:"鲲虚菜",
age:20,
sex:"男",
hobby:function(){
return "喜欢唱跳rap,打篮球";
}
};

另一种是先创建对象,然后再添加属性和属性值:

1
2
3
4
5
6
7
person=new Object();
person.name="鲲虚菜";
person.age=20;
person.sex="男";
person.hobby=function(){
return "喜欢唱跳rap,打篮球";
}

通过函数构造对象

1
2
3
4
5
6
7
8
9
10
11
12
13
function person(name,age,sex,hobby){
this.name=name;
this.age=age;
this.sex=sex;
this.hobby=hobby;

this.changeHobby=changeHobby;
function changeHobby(hobby){
this.hobby=hobby;
}
}
var xkc=new person("鲲虚菜",20,"男");
xkc.changeHobby("喜欢唱跳rap,打篮球");

对象属性和方法的访问

对象属性访问方式有两种,一种是对象名.属性名,还有一种是对象名[属性名],例:person.name;person["name"];

JS对象的循环遍历

可以使用 for…in 语句循环遍历对象的属性。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<p>点击下面的按钮,循环遍历对象 "person" 的属性。</p>
<button onclick="showPerson()">点击这里</button>
<p id="demo"></p>
<script>
function showPerson(){
var x;
var txt="";
var person = {
name:"鲲虚菜",
age:20,
sex:"男",
};
for (x in person){
txt=txt + person[x];
}
document.getElementById("demo").innerHTML=txt;
}
</script>

JS对象属性的删除

对象无需手动删除,JS提供了一种主动释放对象内存的方法(即对象无用后,自动删除)
删除对象的属性:delete 对象名.属性名

对象是引用数据类型

也就是说,当new出一个对象时,这个obj变量存储的实际上是对象的地址,在对象赋值时,赋的也是地址。

1
2
3
4
5
function Person(){}
var zhangsan = new Person(); //zhangsan对象实际存的是地址
var lisi = zhangsan; //赋值时,实际是将zhangsan存的地址给了lisi
lisi.name = "李四"; //李四通过地址修改了对象
console.log(zhangsan.name); //张三再通过地址打开对象,实际已经改变了

引用数据类型,赋值时传递的是引用(地址);基本数据类型,赋值时传递的是数据(值)

img


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!