javascript笔记:深入分析javascript里对象的创建(上)
读jQuery源码时候,我常想到底那些因素会让我读不懂代码,其中最关键的是哪个,最早觉得是jQuery的架构设计,当我查阅资料终于找到jQuery架构设计的入口时候,我发现javascript基础语法的熟练运用才是读源码的关键,因此现在把javascript基础知识系统回顾下很有必要,而且jQuery源码的研究就是对javascript基础知识的加深和灵活运用,我想后面临摹jQuery将和我对javascript基础知识的学习穿插起来,这样一定会对各种疑难问题有更好的解答。
最近深入学习javascript后,有个体会:面向对象的方式编程才是高效灵活的编程,也是现在唯一可以让代码更加健壮的编程方式。如果我们抛开那些玄乎的抽象出类等等思想,我自己对面向对象的从写程序的角度理解就是:复用和封装。复用具体就是让你尽量少写重复代码,封装就是将一些耦合度很高的逻辑放到一个程序块里,而且尽量让里面内容不受外界影响。最后的结论是:优秀的javascript代码都是面向对象的。
今天要讲的是如何构建javascript对象。
ECMA-262对对象的定义是:无序属性的集合,其属性可以包含基本值、对象或函数。javascript的对象其实就是java里的map,即键值对。
在javascript创建一个对象一共有三种方式:
方式一:通过Object对象
方式二:通过构造函数
方式三:对象初始化
1.通过Object对象来构建对象,代码如下:
//直接使用Object创建对象
var obj = new Object();
obj.id = '001';
obj.name = 'My name is obj';
obj.teststring = 'Test obj';
obj.sayHello = function()
{
console.log('id:' + this.id + '@!@name:' + this.name + '@!@teststring:' + this.teststring);
}
obj.sayHello();//id:001@!@name:My name is obj@!@teststring:Test obj
obj['sayHello']();//id:001@!@name:My name is obj@!@teststring:Test obj
var str = 'sayHello';
obj[str]();//id:001@!@name:My name is obj@!@teststring:Test obj
(注意:我这里使用了两种访问对象属性的方式,一种是点运算符,一种是方括号运算符,二者是等价的,但是方括号运算似乎要更强大些,方括号里面我们可以放置变量)
这是最常用,最直观的一种创建对象方法,但是它的缺点太明显了,就是代码复用度很低,我们想到一个对象就创建一个对象,如是就会造成大量的重复代码,因此,javascript程序员将工厂模式引入到了javascrip编程里,请大家看下面的代码:
// 用工厂模式创建对象
function createObj(id,name,teststring)
{
var o = new Object();
o.id = id;
o.name = name;
o.teststring = teststring;
o.sayHello = function()
{
console.log('id:' + this.id + '@!@name:' + this.name + '@!@teststring:' + this.teststring);
}
return o;
}
var obj = createObj('002','My Name is obj2','Test Obj2');
obj.sayHello();//id:002@!@name:My Name is obj2@!@teststring:Test Obj2
obj['sayHello']();//id:002@!@name:My Name is obj2@!@teststring:Test Obj2
var str = 'sayHello';
obj[str]();//id:002@!@name:My Name is obj2@!@teststring:Test Obj2
工厂模式解决了创建相似对象的问题,如果抛开它构造对象的对象识别问题,工厂模式挺完美的,如果你做的javascript应用不是太复杂,建议使用工厂模式构造对象,这种写法可读性很高。(写到工程模式,我在临摹jQuery里面有段注解似乎不太正确,这个以后要修正)。
2.通过构造函数
在我前面的博文《javascript笔记:javascript前世续篇(从javascript起源谈下它的继承) 》里面我从javascript的起源里谈到了javascript面向对象的一些设计思想,其中就有关于javascript构造函数的设计。几乎所有使用构造函数方式构建对象都会使用到new运算符,javascript里面的构造函数比较特别的,在javascript里没有类的概念,new 后面跟的直接是构造函数,大家看下面的代码:
// 使用构造函数创建对象
function Obj(id1,name1,teststring1)
{
this.id = id1;
this.name = name1;
this.teststring = teststring1;
this.sayHello = function()
&nbs
- 发表评论
-
- 最新评论 更多>>