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