原型
首先我们要先弄懂对象,对象分为普通对象和函数对象;
普通对象为
1、最普通的对象,有_proto_属性,但是没有prototype属性。
2、原型对象
函数对象为
1、只要是通过new Function()创建出来的都是函数对象
每创建一个函数都有一个prototype属性,这个属性指向一个对象,也就是原型对象,这个原型对象,包含着特定类型的所有实例共享的属性和方法。原型对象的好处就是,由它创建的实例对象都有共享它所包含的属性和方法。
有一点特殊的是:原型对象属于普通对象。Function.prototype是个例外,它是原型对象,却又是函数对象,作为一个函数对象,它又没有prototype属性。
function Person(){};
console.log(typeof Person.prototype) //Object
console.log(typeof Object.prototype) // Object
console.log(typeof Function.prototype) // 特殊 Function
console.log(typeof Function.prototype.prototype) //undefined 函数对象却没有prototype属性
![](https://images2015.cnblogs.com/blog/1002676/201705/1002676-20170518162655869-398403523.png)
function Dog(){};
Dog.prototype.name = "小黄";
Dog.prototype.age = 13;
Dog.prototype.getAge = function(){
return this.age;
}
var dog1 = new Dog();
var dog2 = new Dog();
dog2.name = "小黑";
console.log(dog1.name); // 小黄 来自原型
console.log(dog2.name); // 小黑 来自实例
![](https://images2015.cnblogs.com/blog/1002676/201705/1002676-20170518163657447-239799657.png)
Dog.prototype 可查看实例对象共享的属性和方法
如果想要知道 对象的原型;可以通过,Object.getPrototypeOf(dog1) (推荐)
相当于dog1._proto_ 但是不推荐
var animal = function(){};
var dog = function(){};
animal.price = 200;
dog.prototype = animal;
var tidy = new dog();
console.log(dog.price)//undefined
console.log(tidy.price)//200
原型链是依赖_proto_,而不是prototype。
由var dog = function(){}可以看出 dog是一个函数对象,其实语句上就是 var dog = new Function();所以dog._proto_ === Function.prototype;而Function.prototype上没有price属性,如果加上Function.prototype.price = ‘123’;那么就会打印出 123
而tidy是一个普通对象,是由dog构造而来,因此 tidy._proto_ == dog.prototype == animal,当tidy上没找到price属性时,就顺着_proto_往上找,而animal有price这个属性,所以tidy.price 显示200