首先說說我最近遇到的神奇程式碼:
Function.prototype.a="a";
Object.prototype.b="b";
function Person(){}
var p=new Person();
console.log("Person.a:"+Person.a+" Person.b:"+Person.b);//Person.a:a Person.b:b
console.log("p.a:"+p.a+" p.b:"+p.b);//p.a:undefined p.b:b
讓我們先從建構函式開始吧!
建構函式是怎麼構建一個例項物件的呢?這裡我放上大神的程式碼,
建構函式的四個步驟:
var obj ={};//建立一個物件
obj.__proto__ = CO.prototype;//obj物件的隱式原型指向建構函式的原型(為什麼說隱式原型呢,因為只有函式才有prototype屬性)
CO.call(obj);//將建構函式作用域賦值給obj物件
return obj;//將obj物件返回
解釋上面部分程式碼(var p=new Person()):就是建立了一個具有Person作用域的物件p,此時p的隱式原型指向Person原型。
往下面走,先分析為什麼Person.a=”a”和Person.b=”b”,首先function Person()其實就是建立了一個Function例項,所以Person.a=”a”,而Person.prototype是一個原型物件,是一個Object例項,所以Person.b=”b”;
而為什麼p.a=undefined而p.b=”b”呢?如果上面建構函式的四個步驟可以懂,其實就很好理解了,首先,p是一個物件,是Object的一個例項,所以它擁有b屬性,但是它並不是Function例項,所以不具備a屬性。
如果有哪裡解釋不對的,望您指正。