碎碎念:JavaScript中的原型链

构造函数 实例对象 实例原型

  • 由图可知,实例对象(person1)本身没有 .name的属性值,但打印输出时返回了 “我是属性值”,而person2打印输出时返回了 “自身的属性值”,由此可以知道,当未给 实例对象(person1) 设置属性值时,实例对象(person1)本身没有属性值,则它会去找它的上一级 ——> 实例原型(Person.prototype)的属性值;当给 实例对象(person2) 设置属性值时,它会先找到自身是否有属性值,如果自身有属性值就不会去找它的上一级。
function Person(){
}
Person.prototype.name="我是属性值";
var person1=new Person();
var person2=new Person();
person2.name="自身的属性值"
console.log(person1.name);
console.log(person2.name);

image.png

_proto_是什么?

  • proto:每个对象都有除null以外的另外一个内存指针_proto_,它是用来指向上一层函数的原型对象。

  • 由下图可知,将实例对象(person1)和实例原型(Person.prototype)分别打印输出,name结果都为"我是属性值",且constructor的构造函数都为function Person(){},由此可知,实例对象(person1.proto)全等于实例原型((Person.prototype))。

console.log(person1.__proto__);
console.log(Person.prototype);

image.png

  • 由图可知,实例原型((Person.prototype))全等于构造函数(Person)。
console.log(Person.prototype.constructor===Person);//true

image.png

既然实例对象有实例原型,那实例原型是否也有它的上一级实例原型?

  • 由图可知:JavaScript原生提供了Object对象,所有对象都继承了ObjectObject是所有对象的实例,所以这里不需要创建一个Object的构造函数,实例原型(Person.prototype.proto)全等于它的上一级实例原型(Object.prototype)
console.log(Person.prototype.__proto__===Object.prototype);//true

image.png

  • 由图可知:实例原型(Object.prototype)也有 Object的构造函数,实例对象(object)调用__proto__全等于实例原型(Object.prototype)
var object=new Object();
console.log(object.__proto__===Object.prototype);//true

image.png

  • 由图可知:实例原型(Object.prototype)调用.constructor全等于构造函数(Object)

console.log(Object.prototype.constructor===Object);//true

image.png

那实例原型Object是否也有它的上一级实例原型?

  • 答案是有的,实例原型(Object.prototype)调用__proto__最终指向的是null,null表示为空,此处不应该有值,由此可知,实例原型——>实例原型(Object.prototype)的原型链就已经结束了。
console.log(Object.prototype.__proto__===null);//true


image.png

构造函数、实例对象、实例原型及实例原型的上一级原型的关系图如下:

image.png

那他们之间是继承关系吗?

  • 他们之间不是继承关系,继承关系指的是子类与父类的关系,子类能够继承父类的所有属性和方法,在原型链中他们只是委托关系,就好比房东和租客中间有一个房屋中介,而房东委托房屋中介将房子找到租客租出去,这也就是原型链中的委托关系。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值