function Phone(ram) { this.ram = ram; this.call = function(){} } var p = new Phone("16GB"); var q = new Phone("32GB");
首先分析构造函数 Phone,定义一个 Phone 构造函数(由于下面是要对此函数使用 new 操做建立新对象的,因此这里说
Phone 是构造函数,其实若是说 Phone 是一个普通函数也是能够的)函数
function Phone(ram) { this.ram = ram; this.call = function(){} }
注意:this
ram
和call
。ram
和call
是构造函数体里的东西,是构造函数经过new
建立出的对象里的属性(绝对不要理解成是构造函数自己的属性),也就是说this.ram=ram
,是新建立出来的对象里面有个ram
属性,值是建立对象时从外部传递进来的值。name
属性,凡是函数都有一个属性叫作name
。好比Person
这个构造函数,它的name
属性值就是Person
;而`var;像这样的声明,
name属性的值就是
person`。以下图所示:以上代码完整的图以下所示:spa
function Phone() { this.ram = "16GB"; } Phone.prototype.call = function(){} var p = new Phone(); var q = new Phone();
Phone
构造函数中有prototype
原型属性,此属性指向原型constructor
属性,此属性指向构造函数call
属性,此属性指向一个函数Phone
构造函数,实例化出了两个对象,这两个实例对象中分别都有__proto__
原型对象属性,此属性指向原型,与Phone
构造函数中的prototype
属性指向的是同一对象p
和q
对象都指向同一个原型对象,因此当调用p.call()
或者q.call()
的时候,即便实例化对象自己中不存在此方法,此方法也会正常执行,由于实例化对象中没有,就会自动去原型中查找,原型中有,就调用了,这也就是原型继承function Phone(){ this.ram = "16GB"; } Phone.prototype = { sayHello: function(){} }; var p = new Phone(); var q = new Phone();
内存图以下所示:prototype
右上角的刚开始的原型对象(有constructor的),没有任何属性指向它了,时间长了,它就被回收了,可是在没回收以前,它是存在的,并非一没有东西指向它了,它就消失了。code