【Web】Javascript基础之原型链

一.prototype

一般函数会预设prototype属性,这个属性是一个对象。

function Foo(){
    this.y=2
}

typeof Foo.prototype;//object
Foo.protype.x=1
var obj3=new Foo();//创建一个实例,函数作为构造器使用,this将指向一个对象,对象的原型将指向构造器的prototype属性。

obj3.y;//2
obj3.x;//1

这里写图片描述

Foo.prototype对象内部结构 
{    
     constructor:Foo,
     __proto__:Object.prototype, 
     //原型,指向object.prototype,因此object的方法才能被拿来直接使用
    x:1  
  } 

二.prototype与原型的不同

函数的prototype对象属性的作用是当使用new方法构造实例的时候,构造器的prototype属性会用作new出来的对象的原型。prototype是函数中预设的对象属性,而原型是对象上的原型。

三.原型链实现继承

function Person(name,age){
this.name=name;
this.age=age;//通过new创建对象时,this指向原型为Person.prototype的空对象,然后通过this.name来给其赋值。


Person.prototype.hi=function(){
    console.log("hi"+this.name)
}//通过这种方式创建所有实例共享的方法。



function Student(name,age,className){
   Person.call(this,name,age);
   this.className=className;
}

Student.prototype=Object.create(Person.prototype);//创建一个空对象,该对象的原型指向它的参数。不能用Student.prototype=Object.prototype的原因:当我们想增加一些student自己的变量会出错。
Student.prototype.constructor=Student;//不设置的话,constructor会指向person


}

同名方法,Student方法会覆盖Person方法。

这里写图片描述

四.动态改变prototype

Student.prototype.x=101//当动态的添加一个x的属性,所有已经创建的对象中都会新增一个x属性。

Student.prototype={y:2};//直接修改,赋值为一个新对象,赋值后,结果如下:
bosn.y;//undefined
bosn.x;//101//已经实例化的bosn并不会被影响。

var nunnly=new Student("Nunnly");
nunnly.x;//undefined
nummly.y;//2//新创建的对象会受到影响。

五.instanceof

[1,2]instanceof Array===true//左侧要求是一个对象,右侧要求是一个函数。该函数将会判断右侧的prototype属性是否出现在左边对象的原型链上。

不同的window或者iframe间的对象检测不能使用instanceof

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值