1. 程式人生 > >js 各種奇葩寫法

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;