- 在构造函数创建出来的时候,系统会默认的帮构造函数创建并关联一个对象,这个对象就是原型。
- 构造函数也是函数,通常用来初始化对象。
- 原型对象中的属性和方法可以被构造函数实例化的对象访问。
- 构造函数.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.在调试过程中,可以轻易的查看原型的成员。
看到这个图是不是有点头大,没关系,后续讲原型链的时候会仔细说明。
总结:现在我们应该了解到:
- prototype是构造函数的属性,通过构造函数.prototype可以访问原型对象
- .__proto__是构造函数实例的属性,通过实例.__proto__可以访问属性
- 构造函数.prototype === 构造函数的实例.__proto__