原型与原型链与继承

一、prototype

在JavaScript中,每个函数都有一个prototype属性,这个属性指向函数的原型对象。

二、proto

这是每个对象(除null外)都会有的属性,叫做__proto__,这个属性会指向该对象的原型。

原型的概念:

每一个javascript对象(除null外)创建的时候,就会与之关联另一个对象,这个对象就是我们所说的原型,每一个对象都会从原型中“继承”属性。

原型链的概念:

每个构造函数都有一个原型对象,原型对象都包含一个指向构造函数的指针,而实例都包含一个指向原型对象的内部指针。那么假如我们让原型对象等于另一个类型的实例,结果会怎样?显然,此时的原型对象将包含一个指向另一个原型的指针,相应地,另一个原型中也包含着一个指向另一个构造函数的指针。假如另一个原型又是另一个类型的实例,那么上述关系依然成立。如此层层递进,就构成了实例与原型的链条。这就是所谓的原型链的基本概念。

当我们访问对象的一个属性或方法时,它会先在对象自身中寻找,如果有则直接使用,如果没有则会去原型对象中寻找,如果找到则直接使用。如果没有则去原型的原型中寻找,直到找到Object对象的原型,Object对象的原型没有原型,如果在Object原型中依然没有找到,则返回undefined。

//es5

function Person(){
  this.name ='person私有属性'
}
/* 
Person.prototype ={
     constructor:Person, //赋值形式需要指定原型对象,否则没有constructor指向当前对象,适用于多个方法一起
     eat(v){
       return v;
     },
     info(v){
       return v;
     }
 }
 Person.prototype.add = function(v){ 
     //直接属性下不需要,适用于单个方法形式
     return v+1;
 }
 */
Object.assign(Person.prototype,{  //和上面的是一样的
  say(v){
    return v+1
  },
  add(v){
    return v+1
  }
})
Student.prototype = new Person()
function Student() {
  this.abc = '私有属性'
}
let s = new Student()

//es6

class Person{
         constructor() {
            this.a = '私有属性'
         }
         static foo(){
             return '静态方法'
         }
     }
class Student extends Person{
         constructor(props) {
             super(props); //super不调用使用this会报错,不传参拿不到父亲的东西结果为undefined
         }

     }
let result = new Student();

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值