js-原型对象以及原型链


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__属性指向取决于对象创建时的实现方式

  1. 字面量方式
var a{

}

在这里插入图片描述

  1. 构造器方式
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)
  1. 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('加油加油')
        }
    }

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值