JavaScript 常被描述为一种基于原型的语言——每个对象拥有一个原型对象,对象以其原型为模板、从原型继承方法和属性。原型对象也可能拥有原型,并从中继承方法和属性,一层一层、以此类推。这种关系常被称为原型链,它解释了为何一个对象会拥有定义在其他对象中的属性和方法。
原型对象prototype
特点
- 每个函数都有一个prototype属性,也就是显示原型,默认指向一个object空对象
- 原型对象中有一个属性constructor,它是指向函数对象
- 可以给原型对象添加方法或者属性
每个函数都有一个prototype属性,默认指向一个object空对象
//解析器添加了一个prototype属性,这个属性其实是一个对象 也就是我们的原型对象
var Person =function(){
}
console.log(Person.prototype)//默认指向一个Object空对象,所谓空对象是指 没有我们的属性
Person.prototype.test=function(){
console.log('test')
}
console.log(Person.prototype)
原型对象中有一个属性constructor,它指向函数对象
console.log(Person.prototype.constructor==Person) //输出结果是true
__proto__属性
特点
- 每个实例对象 都有一个__proto__属性 也就是隐式原型
- 对象的隐式原型的值为其构造函数的显示原型的值
function Person() {
}
var p1=new Person()
//每个函数都有一个prototype 也就是显示原型属性,默认指向空对象,
console.log(Person.prototype)
//每个实例对象 都有一个__proto__属性 也就是隐式原型
console.log(p1._proto_)
//对象的隐式原型的值为其构造函数的显示原型的值
console.log(Person.prototype===p1._proto_)//输出结果是true
//显示原型和隐式原型 保存的是对象的引用
__proto__属性指向
__proto__属性指向取决于对象创建时的实现方式
- 字面量方式
var a{
}
- 构造器方式
var A = function(){};
var a = new A();
![在这里插入图片描述](https://img-blog.csdnimg.cn/926e317304c343ecab77a43bd27f4cf2.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAKn5uaWNvbGV-Kg==,size_20,color_FFFFFF,t_70,g_se,x_16)
- Object.create()方式
var A = {};
var a = Object.create(A);
原型链
构造函数
function Student(){
}
Student.name='嘿嘿'
Student.id=function(){
console.log('3209')
}
var s1 =new Student();
console.log(Student.name)
类
class Son{
static count;
static eat(){
console.log("今天吃什么")
}
sleep(){
console.log('早睡早起身体好')
}
}
继承
//定义一个student类
class student{
constructor(name,age){
this.name=name;
this.age=age;
}
say(){
alert('就快考试啊')
}
}
//定义一个子类继承student
class College extends student{
constructor(name,age,adress){
super(name,age)//调用父类的构造方法
this.adress=adress;
}
sayfinting(){
alert('加油加油')
}
}
子类对父类方法的重写
class student{
constructor(name,age){
this.name=name;
this.age=age;
}
say(){
alert('hello,'+this.name+' welcome to deyun')
}
}
class College extends student{
say(){//重写了父类的say方法
alert('加油加油')
}
}