prototype(指针)是指向通过构造函数创建某个实例的原型对象,原型对象的特点就是:所有对象实例都可以共享它包含的属性和方法。但是其实prototype是每个构造函数的属性而已,只能说万物皆对象罢了。
所以创建一个函数就会,为该函数创建一个protopyte属性,这个属性指向函数的原型对象。默认情况下,所有的原型对象会获得一个constructor属性,这个属性是一个指向protopyte属性所在函数的指针。
普通对象:有__proto__属性,没有prototype属性。
原型对象:person.prototype 原型对象还有constructor属性(指向构造函数对象)
函数对象:通过new Function()创建 拥有__proto__、prototype属性(指向原型对象)。
function Car(){};
Car.prototype.color="白色"
var car1 = new Car();
var car2 = new Car();
car2.color="黑色"
console.log(car2.color) //来自实例
console.log(car1.color) //来自原型
构造函数 <——(指针constructor)——原型对象 <——(指针_proto_)—— 实例
function Car() <——(指针constructor)——Car.prototype <——(指针_proto_)—— car1
原型链
每个构函数都有一个原型对象,原型对象都有一个指向构造函数的指针(constructor),实例包含指向原型对象的指针 (_proto__)
原型链,其实就是实例对象和原型之间组成的链条,就是用来实现共享属性和继承的。
JS在创建对象(不论是普通对象还是函数对象)的时候,都有一个叫做_ proto _的内置属性,用于指向创建它的函数对象的原型对象prototype.。这个有_ proto _ 串起来的直到Object.prototype._ proto _为null的链叫做原型链。如下图:
构造函数实例原型对象的区别
实例就是通过构造函数创建的。实例一创造出来就具有constructor属性(指向构造函数)和proto属性(指向原型对象)
构造函数中有一个prototype属性,这个属性是一个指针,指向它的原型对象。
原型对象内部也有一个指针(constructor属性)指向构造函数:Person.prototype.constructor = Person,实例可以访问原型对象上定义的属性和方法。
总结:
1.protopyte:
只有函数才有的属性,它指向了一个对象,这个对象正是调用该构造函数而创建的实例的原型,也就是这个例子中的car1和car2的原型。(原型:每一个JavaScript对象(null除外)在创建的时候就会与之关联另一个对象,这个对象就是我们所说的原型,每一个对象都会从原型”继承”属性)
2.proto :
每个对象都有的属性,它指向该对象的原型。car1.proto===Car.protopyte
3.construcotr:
每个原型都有一个constructor属性指向关联的构造函数
4.实例与原型:
当读取实例的属性时,如果找不到,就会查找与对象关联的原型中的属性,如果还查不到,就去找原型的原型,一直找到最 顶层为止。所以原型对象是通过Object构造函数生成的,结合之前所讲,实例的proto指向构造函数的prototype.