面向对象
面向对象是一种编程思想。
主要是把事物给对象化,包括其属性和行为。总体来说面向对象的底层还是面向过程,面向过程抽象成类,然后封装,方便使用就是面向对象。
构造函数:
构造函数是专门用于创建对象的函数,如果一个函数使用
new
关键字调用,那么这个函数就是构造函数。
- 使用
new
关键字调用函数的行为被称为实例化 - 实例化构造函数时没有参数时可以省略
()
- 构造函数的返回值即为新创建的对象
- 构造函数内部的
return
返回的值无效!
function foo(a) {
console.log(a);
console.log(1111);
return '返回了';
}
// 通过new调用函数
var reData = new foo(3);
console.log(reData);
实例成员:
通过构造函数创建的对象称为实例对象,实例对象中的属性和方法称为实例成员。
-
构造函数内部
this
实际上就是实例对象,为其动态添加的属性和方法即为实例成员 -
为构造函数传入参数,动态创建结构相同但值不同的对象
-
实例对象的
constructor
属性指向了构造函数 -
instanceof
用于检测实例对象对应的构造函数注意:构造函数创建的实例对象彼此独立互不影响。
function Person() {
this.name = 'zs';
this.sayHi = function() {
console.log("Hello!!");
}
}
// 创建Person的实例对象 现在p1就是this
let p1 = new Person();
console.log(p1);
console.log(p1.name);
p1.sayHi();
function Person() {
this.name = 'zs';
this.sayHi = function() {
console.log("Hello!!");
}
}
// 创建Person的实例对象 现在p1就是this
let p1 = new Person();
// 查看指向哪个构造函数
console.log(p1.constructor);
// 检测实例对象是否是某一个类的对象
console.log(p1 instanceof Person);
静态成员:
在 Js 中底层函数本质上也是对象类型,因此允许直接为函数动态添加属性或方法,构造函数的属性和方法被称为静态成员。
- 静态成员指的是添加到构造函数本身的属性和方法
- 一般公共特征的属性或方法静态成员设置为静态成员
- 静态成员方法中的
this
指向构造函数本身
function Person() {
this.name = 'zs'
};
Person.eyes = '两只';
Person.arms = '两条';
Person.walk = function() {
console.log("都会走路");
console.log(this.eyes);
}
console.log(Person.name);
console.log(Person.eyes);
console.log(Person.arms);
Person.walk();
引用类型
Object:
Object
是内置的构造函数,用于创建普通对象。
创建对象的三种方法:
// 字面量创建对象
let people = {
name: 'zs',
age: 18,
}
// 对象语法简写
let name = '小明';
let user = {
name,
walk() {
console.log('刷刷微信步数');
}
}
// 构造函数创建对象
let student = new Object({
name: '小红',
age: 12
})
console.log(people instanceof Object);
console.log(user instanceof Object);
console.log(student instanceof Object);
普通对象赋值后,无论修改哪个变量另一个对象的数据值也会相当发生改变。
-
推荐使用字面量方式声明对象,而不是
Object
构造函数 -
Object.assign
静态方法创建新的对象 -
Object.keys
静态方法获取对象中所有属性 -
Object.values
表态方法获取对象中所有属性值
堆与栈的区别:
- 堆和栈是内存中的数据存储空间
- 简单类型的数据保存在内存的栈空间中
- 引用类型的数据保存在内存的堆空间中,栈内存中存取的是引用类型的地址(房间号)
.
RegExp:
RegExp
内置的构造函数,用于创建正则表达式。
使用构造函数创建正则:
let reg = new RegExp('\d', 'i');
reg.exec('1')
字面量创建正则小案例:
// 把字符串内的r全部替换为荣
let str = 'ferqwfwefwerewdewfdasxwadwefawszcew';
let reg = /r/gi;
// g为global 全局,全部
// i为ignore 忽略大小写
// 根据正则替换
let newStr = str.replace(reg, '荣')
console.log(newStr);