学习笔记7-对象
2020-02-16 本文已影响0人
kjiwu
对象
对象,一种容器(聚合或复杂数据类型)
对象属性枚举
属性的顺序是无序的
- for……in
const obj = { a: 1, b: 2, c: 3 };
for (let p in obj) {
if (!obj.hasOwnProperty(p)) continue;
console.log(`${p}:${obj[p]}`);
}
for……in循环不会枚举符号类属性
- Object.keys
Object对象提供的一种枚举字符串属性的方法,并返回一个数组
const obj = { a: 1, b: 2, c: 3 };
Object.keys(obj).forEach(p => console.log(`${p}:${obj[p]}`));
Object.keys也不会枚举符号类属性
类的创建和实例化
class Shape {
constructor(...props) {
}
}
let shape = new Shape();
JavaScript类中没有访问权限的限制
类即是函数,类只不过是ES6中提供的一个语法,实际类还是函数
类中使用this,this指的是引用方法被调用时所绑定的实例
class ES6Class {}
function ES5Class() {}
console.log(typeof ES6Class); //function
console.log(typeof ES5Class); //function
原型
- 每个函数都有一个prototype属性
- 使用new创建实例时,会将原型对象存储到自己的proto属性中
原型的动态调度
当试图访问对象的某个属性或方法是,如果它不存在于当前对象中,JavaScript会检查它是否存在于对象原型中。
class Shape {
constructor(...props) {
}
area() {
console.log('area function');
}
}
const shape = new Shape();
console.log(shape.area === Shape.prototype.area); // true
shape.area(); //调用的是原型中area方法
shape.area = () => console.log('my area');
shape.area(); //调用的是我们新赋值的area方法
静态方法
静态方法不于实例绑定,它和类相关联
class Shape {
static showInfo() {
console.log('this is Shape class');
}
}
Shape.showInfo();
继承
class Shape {
}
class Rectangle extends Shape {
constructor() {
super();
}
}
extends关键字,表示Rectangle继承自Shape
super函数,父类的构造器,子类的构造函数必须调用这个方法
原型链
如果一个方法没有在对象原型中找到其定义,它就会检查原型的原型,这样就形成了一个原型链;JavaScript会沿着原型链一直找下去,如果没有找到,最终程序会报错。
多态
多态,一个实例不仅是它自身类的实例,也可以被当做它的任何父类的实例来使用.
JavaScript中所有对象都是Object的实例。