``对象中存储属性的区域实际有两个:
- 对象自身
- 直接通过对象所添加的属性,位于对象自身中
- 在类中通过x=y的形式添加的属性,位于自身对象中
- 原型对象(prototype)
- 对象中还有些内容,会存储到其他对象里(原型对象)
- 在对象中会有一个属性来存储原型对象,这个属性叫做_ _ proto_ _
- 原型对象也负责为对象存储属性,当我们自身访问属性时,会优先访问对象自身属性,对象自身不包含该属性时,才去原型对象中寻找
- 会添加属性到原型对象的情况:
- 在类中通过XXX(){}方式添加的方法,在原型中
- 主动向原型中添加的属性或方法
class Person{
name="桃良"
age=18
sayHello(){
console.log("hello,我是",this.name)
}
}
const p= new Person()
console.log(p)
console.log(p._ _proto_ _)
访问对象原型
对象. _ proto_
Object.getProtoypeOf(对象)
原型对象中的数据
-
对象中的数据(属性,方法等)
-
constructor(对象的构造方法)
注意:原型对象也有原型,这样就构成了一条原型链,根据对象复杂程度不同,原型链的长度也不同 p对象的原型链 p对象 --> 原型 -->原型 --> null obj对象的原型:obj对象 --> 原型 --> null
所有的同类型对象它们的原型对象都是同一个,也就意味着,同类型对象的原型链是一样的
原型的作用:原型就相当于是一个公共的区域可以被所有该类实例访问,可以将该类实例中,所有的公共属性(方法)统一储存到原型中,这样我们只要创建一个属性,就可以被所有实例访问
JS中继承就是通过原型实现的,当我们继承时子类的原型就是一个父类的实例
instanceof
instanceof用来检查一个对象是否是一个类的实例
- instanceof检查的是对象的原型链上是否有该类实例,只要原型链上有该实例,就会返回true == Object是所有对象的原型,所以任何对象和object进行instanceof运算都会返回true==
in - 使用in运算符检查属性时,无论属性在对象自身还是原型时都会返回true
- Object.hasOwn(对象,属性名)
- 用来检查一个对象自身是否含有某个属性
new运算符
面向对象
面向对象的本质就是,编写代码时所有操作都是通过对象来进行的
面向对象编程的步骤
- 找对象
- 搞对象
学习对象
- 明确这个对象有什么用,代表什么
- 如何获取这个对象
- 如何使用这个对象(对象中的属性和方法)
对象的分类
内建对象
- 由ES标准所定义的对象
- 比如 Object Function String Number…
宿主对象
- 由浏览器提供的对象
- BOM,DOM
自定义对象
- 由开发人员自己创建的