JavaScript原型和闭包之---prototype与__proto__的关系(四)

回忆复习:
前面我们将构造函数原型的时候,说过

  • 在构造函数创建出来的时候,系统会默认的帮构造函数创建并关联一个对象,这个对象就是原型。
  • 构造函数也是函数,通常用来初始化对象。
  • 原型对象中的属性和方法可以被构造函数实例化的对象访问。
  • 构造函数.prototype可以访问原型
  • 构造函数实例化的对象.__proto__也可以访问原型
    那么现在这里就说明一下prototype与.__proto__分别是什么
    还是用实例解释说明吧:
function Person(name,age){
        this.name = name;
        this.age = age;
    }

每个构造函数都有一个prototype(原型)属性,这个属性是一个指针,指向一个对象。而这个对象的用途是包含可以由特定类型的所有实例共享的属性和方法。原型对象默认是一个空对象。
如图所示:
这里写图片描述

  • 通过构造函数访问原型方法是: 构造函数.prototype
console.log(Person.prototype); //输出一个Object

原型这篇博客中,我们也说过,prototype是构造函数的属性,跟对象没有关系。

Person实例化一个对象

 var p = new Person();

     console.log(p.prototype); 

让对象p去访问原型,发现结果输出undefined 。

那么如何让构造函数实例化的对象也能访问原型对象呢?

  • 通过对象去访问原型,利用的就是.__proto_属性

    .__proto__是一个非标准的属性
    为了保证通用性 这个属性不推荐使用
    《javascript高级程序设计》中说:

当调用构造函数创建一个新实例后,该实例的内部将包含一个指针(内部属性),指向构造函数的原型对象。ECMA-262第5版中管这个指针叫[[Prototype]]。虽然在脚本中没有标准的方式访问[[Prototype]],但Firefox、Safari和Chorme在每个对象上都支持一个属性.__proto__;而在其他实现中,这个属性对脚本则是完全不见的。不过要明确的重要一点是:这个连接存在于实例和构造函数的原型对象之间,而不是存在于实例和构造函数之间。

简单的将:实例对象的proto属性可以访问原型对象

p.proto;
打印输出看一下:

var p = new Person("kong",18);
console.log(p.__proto__);//输出一个Object

既然使用构造函数的prototype和实例对象的.\__proto__属性,都可以访问原型对象
就有如下结论:(自己可以打印输出一下试试)

p.__proto__ === Person.prototype;

.__proto__属性的用途

1.可以用来访问原型

2.在实际开发中除非有特殊的需求,不要轻易的使用实例对象的.__proto__属性去修改原型的成员,

3.在调试过程中,可以轻易的查看原型的成员。
这里写图片描述
看到这个图是不是有点头大,没关系,后续讲原型链的时候会仔细说明。

总结:现在我们应该了解到:

  1. prototype是构造函数的属性,通过构造函数.prototype可以访问原型对象
  2. .__proto__是构造函数实例的属性,通过实例.__proto__可以访问属性
  3. 构造函数.prototype === 构造函数的实例.__proto__
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值