之前我們說過函數(shù)也是對象的一種,對象是若干屬性的集合,那么函數(shù)肯定也是若干屬性的集合呢,
javascript事先給我們做了一個表態(tài),給函數(shù)加上了一個叫prototype的屬性,這個屬性同時又是一個對象,里面包含一個默認(rèn)屬性constructor,指向函數(shù)本身。
prototype
如上圖,SuperType是是一個函數(shù),右側(cè)的方框就是它的原型。
原型既然是一個對象,當(dāng)然不可能只有constructor一個屬性,我們可以可以給其增加一些其他的屬性,如下圖:
object
里面有些方法是不是看著很眼熟呢?也可以自己添加屬性和方法:
function Fn() { }
Fn.prototype.name = 'oyakuki';
Fn.prototype.getYear = function () {
return new Date().getFullYear() - 1988;
};
console.log(Fn.prototype);
打印輸出的結(jié)果如下圖:
Paste_Image.png
可以看到多了一個getYear方法和name屬性;
但是這樣做,有什么用呢?
我們還是從jquery看:
var $div = $("div");
$div.attr("class","newclassname");
上面的代碼我們很容易理解,$('div')返回的是一個對象,對象——被函數(shù)創(chuàng)建的。假設(shè)創(chuàng)建這一對象的函數(shù)是 myjQuery。它其實是這樣實現(xiàn)的:
myjQuery.prototype.attr = function () {
//……
};
$('div') = new myjQuery();
如果還不是太理解的話,套用我們的代碼解釋一下:
function Fn() { }
Fn.prototype.name = 'oyakuki';
Fn.prototype.getYear = function () {
return new Date().getFullYear() - 1988;
};
var fn = new Fn();
console.log(fn.name); //oyakuki
console.log(fn.getYear()); //29
即,F(xiàn)n是一個函數(shù),fn對象是從Fn函數(shù)new出來的,這樣fn對象就可以調(diào)用Fn.prototype中的屬性。
因為每個對象都有一個隱藏的屬性——“proto”,這個屬性引用了創(chuàng)建這個對象的函數(shù)的prototype。即:fn.proto === Fn.prototype.