Javascript对象定义方式的比较

来源:互联网 发布:大数据和java的关系 编辑:程序博客网 时间:2024/05/22 03:43

1. 字面量形式

var obj1 = {    name: "obj1",    fuc: function () {    alert("OK");    }};

优点:字面量形式与json对象类似,简单直观。
缺点:(1)代码不具备重用性,如果要创建一个具有相同成员的对象obj2,则需要将上述定义代码全部copy给obj2。(2)仅使用字面量方式,不能动态添加对象成员。

2.创建object实例

var obj2 = new Object();obj2.name = "obj2",obj2.fuc = function () {    alert("OK");};

优点:可以动态的为对象添加成员。
缺点:代码仍不具备重用性,即fuc函数仍仅为对象obj2所持有。

3.构造函数定义

function Obj3() {    this.name = "obj3",    this.fuc = function () {        alert("OK");    };}

优点:对象成员name和fuc为类型Obj3的所有实例所共有,即每个定义的Obj3实例都至少包含name和fuc两个成员。
缺点:每定义一个对象实例,都会开辟一段空间用于保存成员name和fuc,而函数一般为所有实例所共享,只需要开辟一个空间即可,故构造函数方式造成了额外的内存开销。

4.原型方式

function Obj4() {}Obj4.prototype.name = "obj4",Obj4.prototype.fuc = function () {    alert("OK");};

优点:所有对象实例共享一段内存空间,节省了空间开销,达到了Java中静态成员变量的效果。
缺点:对普通成员变量,即非函数的成员不建议使用,因为普通成员变量一般记录对应实例的特性,对原型中成员变量的更改会反映到每个实例中,因为每个实例都从同一块内存区中读取成员变量值。

错误的定义方式

Obj4.fuc = function () {    alert("OK");};

特别提醒:有Java或C#开发经历的朋友可能会误用此方式,这其实是不符合js语法的,如果调用fuc方法,会返回undefined错误,请牢记!

推荐的方式

function Obj4() {    this.name = "obj3";}Obj4.prototype.fuc = function () {    alert("OK");};

朋友们在JS开发中,建议将普通成员变量定义在构造函数中,这样每个实例都会有自己的一个成员变量存储空间,保存特有的状态;在对象原型中定义成员函数,从而所有实例共享只占用一个内存区的函数。
笔者在武汉读研,第一次写博客呢,有表达不好的地方请前辈们多多批评指正,感谢支持!!!