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