關於js的一道題(大佬勿笑)

咩也都唔識發表於2018-04-27

首先說說我最近遇到的神奇程式碼:

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屬性。

如果有哪裡解釋不對的,望您指正。


相關文章