原型

首先我们要先弄懂对象,对象分为普通对象和函数对象;

普通对象为

  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属性 

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); // 小黑 来自实例  

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

 

posted @ 2017-05-18 16:56  过去以后#5626  阅读(139)  评论(0编辑  收藏  举报