js 各种奇葩写法

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/zb219/article/details/7733771

学标准语言出身的人,看到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;

     

展开阅读全文

没有更多推荐了,返回首页