function OMakeNewCar(){
}//构造函数
var car = new OMakeNewCar();//实例对象
OMakeNewCar.prototype 指向构造函数 OMakeNewCar 自身的原型对象。要理解这一点。每在屏幕上敲出来一个函数,啥构造不构造的,根本不用管,系统都会为这个函数创建一个 prototype 属性。这个 prototype 属性指向一个对象,这个对象就是此函数的原型对象。原型对象哪来的,系统分配的呗,当然这里要注意一点,原型对象可不是 Function 或 Object,而是系统会为每个函数创建属于它自己的原型对象,因此每个函数的原型对象都是不同的。那原型对象里都有啥,其实很简单,如果你不操作这个原型对象,那么一开始它只包含一个属性:constructor。当然可以在原型对象上添加你想添加的任何属性。constructor 属性干啥用的?指向函数自身。回到问题,OMakeNewCar.prototype 指向的就是函数 OMakeNewCar 的原型对象。如果想看看此时 OMakeNewCar 原型对象中的 constructor 属性,可以这样写 OMakeNewCar.prototype.constructor。OMakeNewCar.prototype.constructor 就是 function OMakeNewCar() {}。 2、car 是构造函数 OMakeNewCar 的实例,但 car 没有 prototype 属性。只有函数才有 prototype 属性,其他对象均没有此属性。 car 不是函数,而只是一个普通对象。简单解释一下 var car = new OMakeNewCar(); 这段代码。先看等号右边 new OMakeNewCar(),别管什么 new 不 new 的,这不过就是在调用 OMakeNewCar 这个函数,函数调用后都有返回值(没有明确返回值的函数,返回值是undefined)。那函数前面加了 new 调用,返回值是啥呢?返回值是一个对象。再看等号的左边,从函数中返回的对象被赋值给了 car。因此,此时的 car 就代表了返回的对象。car 代表的对象只是一个普通对象,所以没有 prototype属性。这里需要插句话,为了测试加了这样一句代码 OMakeNewCar.prototype.mm = 1;也就是在构造函数原型上加了 mm 这个属性,并把 1 赋值给了这个属性。下面我写的这句代码也是可以正确运行的alert(car.mm); // 弹出 1接下来,任何对象上的都有的一个属性,叫做 proto,跟函数上的 prototype 属性有点像,没错,确实有点像。这个属性干嘛用的?指向该对象构造函数上的原型对象,即和构造函数的 prototype 属性指向的是同一个对象。回到问题,car 的构造函数是 OMakeNewCar,那么 car.proto 指向的就是 OMakeNewCar 的原型对象。看看下面的这两句代码OMakeNewCar.prototype.mm = 1;alert(car.mm);mm 属性 car 对象上原本没有,但其构造函数的原型对象上有,所以在 car 上找不到 mm 时,系统就会通过 proto 找到其构造函数的原型对象,然后找到了 mm 属性。当然实际写代码时不要加 proto 属性,直接写 car.mm 就行,如果在 car 对象中找不到 mm,系统就会自动到其构造函数的原型对象上去找。