其实就是一种类型,即引用类型。而对象的值就是引用类型的实例。
在ECMAScript中引用类型是一种数据结构。用于将数据和功能组织在一起,它也常被称做为类,但ECMAScript中却没有这种东西。虽然ECMAScript是一门面向对象的语言。却不具备传统面向对象语言所拥有的类和接口等基本结构。
万物皆对象,除了数字,字符,布尔这种绝对值以外的所有部分都是对象, 对象是类的实例化体现,类是对象的抽象体现。
对象是一个个体,他具备自身类的所有属性和方法。
通过一个类创建一个实例对象:var obj=new Object();
类,基类,超类,子类,父类,实例化
面向对象的三要素:封装,继承,多态
类: 具有相同特征,相同表现,相同方法的集合抽象体
实例化:类的具象化表现 new 类()
var obj=new Object();
class 男朋友{
// 实例化属性
name="";
age=18;
constructor(_name){
// 构造函数 真实的名称就是男朋友
this.name=_name;
// 这里的this指向new 产生的实例化对象
}
// 实例化方法
编程(){
console.log(this.name+"编程!");
}
}
new
的时候就会执行男朋友类
的constructor函数
this
的指向都是你new
出的实例化对象实例化方法必须使用new出来的实例化对象调用
实例化方法是为了让每个独立的实例化对象完成自身所需要运行方法
实例化方法中和构造函数中this的指向都是new出的实例化对象
var arr=new Array();
console.log(arr.constructor===Array)
class Array{
static LEN=3;
constructor(){
console.log(this)
}
push(){
console.log(this)
}
unshift(){
}
pop(){
}
shift(){
在实例化方法中可以通过类名调用到静态方法,不能使用this访问静态方法
Array.isArray()
}
static isArray(){
Array.from();
// 不能在静态方法中直接通过this调用实例化方法
}
static from(){
}
}
extends
继承class Box{
a=1;
name="";
constructor(_name){
this.name=_name;
}
play(){
console.log("play");
}
jump(){
console.log("jump");
}
}
super
方法来调用执行超类的构造函数class Ball extends Box{
age=20
// 参数和临时属性尽量使用_起头
constructor(_name,_age){
// 继承后必须在构造函数中使用super方法来调用执行超类的构造函数
// 必须在第一行中使用super方法调用 ,super()可以理解为执行了超类的构造函数
super(_name);
this.age=_age;
}
run(){
console.log("run")
}
// 重写 override
play(){
console.log("plays")
}
jump(){
super.jump();//调用超类中原有jump方法
// 然后再重写新添加的内容
console.log("jump123")
}
}
var b=new Ball("bBall",26);
b.play();
b.run();
b.jump();
console.log(b)
使用模块化,必须使用type=module属性
必须使用web服务方式打开
<script type="module">
</script>
从a.js导入这个类,赋值给A
import A from "./js/A.js";
var ab=new A();
ab.play();
import B from "./js/B.js";
new B();
import obj from "./js/C.js";
console.log(obj);
Identifier 'obj' has already been declared 导出的obj与这个变量同名
同一文件下不可重名
导出时的名字必须和这里名称统一
as 就是起别名obj1
import {obj as obj1,ab,D,arr} from "./js/D.js";
var obj={c:1,d:2};
console.log(obj);
console.log(obj1)
ab();
var d=new D();
console.log(d);
console.log(arr);
import E,{obj,ab} from "./js/E.js";
console.log(obj);
ab();
var e=new E();
console.log(e);
export default class A{
constructor(){
}
play(){
console.log("play")
}
}
export 导出多个时,没有default,这个时候必须使用var定义的变量,必须在导出function定义函数的名字
export var obj={
a:1,b:2
}
export function ab(){
console.log("ab")
}
export class D{
}
export var arr=[1,2,3,4];
那么导入的时候就是:
import {obj as obj1,ab,D,arr} from "./js/D.js";
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<script>
class Rect{
// 注意属性初值的添加
elem;
bool= false;
x=0;
static list = new Set();
constructor(){
// 创建一个div给实例对象的elem属性
this.elem = document.createElement('div');
// 给这个div添加样式
Object.assign(this.elem.style,{
width:"50px",
height:"50px",
backgroundColor:'red',
position:"relative",
left:0,
})
// 在实例化后,将实例化的对象存在全局list属性列表中,静态方法的调用
Rect.list.add(this);
// 将this.elem添加到body之后
document.body.appendChild(this.elem);
// 给每个this.elem侦听;箭头函数this指向函数外
this.elem.addEventListener('click',e=>this.clickhandler(e));
console.log('aas');
}
/* 点击之后是将布尔值互转 */
clickhandler(e){
this.bool = !this.bool;
}
/* 刚开始条件限制不执行 */
update(){
if(!this.bool) return;
this.x++;
this.elem.style.left = this.x+'px';
}
/* 将得到的实例全部放在静态set集合中,遍历执行实例方法 */
static upDate(){
for(var item of Rect.list){
// 执行每一个实例的update方法
item.update();
}
}
}
for(var i=0;i<5;i++){
new Rect();
}
/* 每16微秒执行一次静态方法 */
setInterval(function(){
Rect.upDate()
},16)
</script>
</body>
</html>