js 各種奇葩寫法
學標準語言出身的人,看到js各種寫法覺得匪夷所思,感覺js是一種隨便亂寫都不會報錯的語言.下面總結一下js的各種奇葩寫法.
物件
var a= {};
陣列
var b = [];
史上最簡單宣告物件與陣列寫法
匿名函式
(function(i)(alert(i))(5);
(window.aa = function () { alert(); })();
寫法相當怪異,實際是在第一個()裡面寫一個function ,下一個()執行這個方法
那麼我們為什麼要這麼寫呢?
也許有時候,我們想執行一個方法,但又不想定義這個方法,又不想寫全域性變數的時候吧.
所謂類
var Cu = function () { this.cc = 10; };
Cu.aa = 8;
Cu.prototype.bb = 9;
var cu = new Cu();
alert(cu.aa); //undefine
alert(cu.bb); //9
alert(Cu.bb); //undefine
alert(cu.cc); //10
prototype 是個神奇的屬性,Cu.prototype表示Cu這個類的原型,Cu.prototype.bb表示Cu這個類的原型加個屬性bb,但是這個bb是內部屬性,只有例項化後才能訪問.他的作用其實跟在function裡面定義this.cc=10.是一樣的.
而Ca.aa可以看成是靜態屬性.
所謂繼承
var Cu = function () { this.cc = 10; this.call = function () { alert() } };
Cu.call2 = function(){alert(2)};
var Rt = function(){};
Rt.prototype = Cu;
var rt = new Rt();
rt.call();//報錯
rt.call2();//正確
大部分語言的繼承都是繼承類名,而js 要實現繼承,就是給prototype賦值,從上面的例子看,prototype要在例項化之後才能訪問,但並不代表prototype所指的物件也會跟著例項化.所以prototype = Cu 是沒用的,prototype要指向一個例項,如
var Cu = function () { this.cc = 10; this.call = function () { alert() } };
var cu = new Cu();
var Rt = function () { };
Rt.prototype = cu;
var rt = new Rt();
rt.call();
所謂例項化一個類
var C=function(){};
var c = new C();
var c = new C;
實際是一回事,但在大部分情況下,C與C()卻不是一回事,僅在new的時候是一回事.
如果
var C = function{){return 5;} ;
var c = new C();
alert(c);
會怎麼樣呢?不會打出5,而是打出個object ,這個object裡面什麼也沒有.
但是
var Class = function () { var klass = function () { this.a = 5; this.b = 6; }; klass.bb = 5; return klass; };
var C = new Class;
alert(C.bb); //返回5
var c = new C;
alert(c.a); //返回5
如果function()裡面返回一個function()的話,new出來的物件就是這個返回出來的function;
在最後,寫一個類和繼承的完整寫法
var Person = function ()
{
//建構函式與宣告為一體的類
this.name = "";
this.birth = 0;
this.speak = function () { alert("汪汪") };
};
var person = new Person();
var Student = function ()
{
this.school = "";
this.sex = 0;
}
Student.prototype = person;
var student = new Student;
alert(student.name);
alert(student.school);
這一般可以滿足我們的要求,可是不怎麼符合我們的習慣,比如我要繼承父類必須要先例項化父類,並且還要格外寫一行Student.prototype = person;