JS学习笔记-原型及原型链

一、原型

  • 原型对象
  • prototype

每一个函数都有一个prototype属性,这个属性是一个指针,指向一个原型对象,
这个原型对象的用途是包含可以实例共享的属性和方法。
创建一个构造函数,就会默认创建一个属性prototype,指向函数的原型对象,

  • constructor

函数的原型对象会有一个默认属性constructor,指向这个函数。

  • –proto–
    当调用构造函数创建一个实例后,这个实例内部包含一个原型指针[[prototype]],指向构造函数的原型对象。(但在脚本中没有标准方式访问[[prototype]],但是对象都支持一个属性–proto–,)
    在这里插入图片描述
    举个例子:
function Car (){}
Car .prototype.name = "volvo"
Car .prototype.color = "red"
Car .prototype.saycolor = function (){
     console.log(this.color)
}
var car1=new  Car ()
 console.log(car1.name)//volvo

这里Car是构造函数,Car .prototype是构造函数的原型对象,car1是Car的实例,所以car1的原型指针指向Car的原型对象,所以car1.name是原型对象里的name。看图片更好理解。
在这里插入图片描述

  • 原型的原型

每个对象都是基于一个引用类型创建的,所以
所有的原型对象都是来自于 Object的原型
在这里插入图片描述

//所以
car1._proto_ = Car.prototype       //ture
car1._proto_._proto_ = Object.prototype //ture
car1._proto_._proto_ ._proto_  =null
小考:
Car.prototype._proto_  =?

对象属性查找

当代码读取对象属性值时,都会执行一次搜索,目标是具有给定名字的属性。搜索顺序1、实例对象本身2、搜索指针指向的原型对象。3、一直往上查找,直到null。
可以通过对象实例访问原型值,但不能通过实例修改原型值。
当为实例添加一个属性时,这个属性会屏蔽原型对象中的同名属性值。如:

function Car (){}
Car .prototype.name = "volvo"
Car .prototype.color = "red"
Car .prototype.saycolor = function (){
     console.log(this.color)
}
var car1=new  Car ()
var car2=new  Car ()
car1.name = "chevrolet"
 console.log(car1.name)//chevrolet
  console.log(car2.name)//volvo

这里car1添加了一个同名属性name,所以会屏蔽原型属性,但不会修改那个属性,所以car2的name还是原型值。

2、原型操作

  • isPrototypeOf()确定对象之间是否存在原型关系.即(参数:)实例 是否有指向 函数原型对象的指针,
 console.log(Car .prototype.isPrototypeOf( car1))      //ture
  • hasOwnProperty()检测一个属性是存在于实例中,还是存在于原型对象中。来自实例为true,来自原型为false。
 console.log(car1.hasOwnProperty("name"))      //ture
 console.log(car2.hasOwnProperty("name"))     //false
  • for-in :返回所有能通过对象访问的可枚举的属性
console.log("name"in car1)//ture
  • 查看原型:ES6的方法Object.prototype.proto

3、原型链

基本思路:利用一个原型让一个引用类型继承另一个引用类型的属性和方法。即让一个原型对象等于另一个实例,这个原型对象就含有指向另一个实例对象的指针;太绕了。看例子:

function A (){
this.name = "a"
}
A.prototype.getname = function (){
return this.name
}
function B (){
this.Bname = "sun"
}
B.prototype = new A ()   //B.prototype理解为A的实例,所以B.prototype含有指向A原型的指针
B.prototype.getBname=function(){
return this.Bname
}
var b = new B ();
console.log(b.getname())//a
console.log(b.name)//a

在这里插入图片描述
这里,b为B的实例,这样b实列就包含一个指向B原型对象的指针,我们让原型对象B.prototype等于A的实例,此时B.prototype将包含一个指向A的原型的指针,
如此层层递进,就构成了实例与原型的链条,这就是原型链的基本概念,
别忘记默认的原型,即Object的原型对象。A的原型包含一个指向Object的原型对象的指针。
在这里插入图片描述
先写到这里!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值