深入理解javascript原型和閉包(3)——prototype原型
既typeof之后的另一位老朋友!
prototype也是我們的老朋友,即使不了解的人,也應該都聽過它的大名。如果它還是您的新朋友,我估計您也是javascript的新朋友。
在咱們的第一節(深入理解javascript原型和閉包(1)——一切都是對象)中說道,函數也是一種對象。他也是屬性的集合,你也可以對函數進行自定義屬性。
不用等咱們去試驗,javascript自己就先做了表率,人家就默認的給函數一個屬性——prototype。對,每個函數都有一個屬性叫做prototype。
這個prototype的屬性值是一個對象(屬性的集合,再次強調?。?,默認的只有一個叫做constructor的屬性,指向這個函數本身。
SuperType-->prototype(屬性)-->constructor(屬性值,還可以自定義)
原型既然作為對象,屬性的集合,不可能就只弄個constructor來玩玩,肯定可以自定義的增加許多屬性。例如這位Object大哥,人家的prototype里面,就有好幾個其他屬性。
Object-->prototype(屬性)-->屬性值是個對象,里面屬性-->constructor/hasOwnProperty/isPrototypeOf/propertyIsEnumerable/toLocaleString/toString/valueOf ?(這些屬性都是function)
咦,有些方法怎么似曾相似?
對!別著急,之后會讓你知道他們為何似曾相識。
接著往下說,你也可以在自己自定義的方法的prototype中新增自己的屬性
function Fn(){ }
Fn.prototype.name="劉慧玲",
Fn.prototype.getYear=function(){
? ? return ?1991;
};
function Fn() { }
Fn.prototype.name = '劉慧玲';
Fn.prototype.getYear = function () {
return 1991;
};
var fn = new Fn();
console.log(fn.name);
console.log(fn.getYear());
即,Fn是一個函數,fn對象是從Fn函數new出來的,這樣fn對象就可以調用Fn.prototype中的屬性。
因為每個對象都有一個隱藏的屬性——“__proto__”,這個屬性引用了創建這個對象的函數的prototype。即:fn.__proto__ === Fn.prototype
這里的"__proto__"成為“隱式原型”,下回繼續分解。