javascript面向对象--定义对象(1)
javascript本身不是完全面向对象的哦。。另外,它是一种动态语言,所谓动态,一开始我以为解释执行的就是动态,后来才知道不是。。。像java和C#,他们的属性和方法,一旦定义了,就不能够改变了,而动态语言,可以动态地增加、删除对象的属性和方法。。够牛哦
定义javascript的对象其实有三种方法:
(1)使用Object对象。
Object是js内置的。比如代码1:
代码1:
1 var widget= new Object(); //声明一个对象;
2 widget.width = "300px"; //width属性
3 //等等,width哪里来的?js是动态语言,width属性是动态加到obj上的,不像C#,java一样,必须先声明类的属性哦。。
4 widget.show = function(){
5 alert(this.width);
6 }
7 widget.show();
既然javascript可以动态增减属性,那怎么删除属性呢?接代码1:
widget.width = undefined 或者delete widget.width;
然后:alert(widget.width);
会弹出:undefined;
(3) JSON样式的对象,比如代码2:
代码2:
1 var widget = {
2 "width":"300px",
3 "show":function(){
4 alert(widget["width"]);
5 }
6 };
7 widget.show();
在代码2里,初学的可能会以为var widget={} 是一个类的定义,那么使用这个类,为什么不去new一个对象呢?
实际上 var widget={} 本身是一个对象,直接用。。。
其中的属性”width","show" 的双引号,可要可不要;
另外调用属性,我们可以看到两种方式,第一种是用点号加属性名,如 widget.show(); 第二种则是中括号的形式, 比如 widget["width"];
当然还有第三种,借助eval()函数,比如,将代码2里的第7行改为以下两行代码:
1 var str =" widget.show()";
2 eval(str);
打到一样的效果,麻烦吗?麻烦,但是,借助于eval这个函数调用属性,适用于那些属性名字不知道的情况。。。
(3)第三种定义对象的方法,比较麻烦。----function,比如代码3
代码3:
1 function widget(width) {
2 this.width = width;
3 }
4 widget.prototype = {
5 show:function(){
6 alert(this.width);
7 }
8 };
9 var w = new widget("300px");
10 w.show();
在javascript里,函数是第一公民,对象可以通过function去创建;这里借助了new关键字;
代码1-3,是一个构造函数。给对象的width属性赋值;通常模拟创建一个类的时候,在构造函数里只给属性赋值,而在prototype原型里写方法的定义,自然,按照如下的方式去做也不错:
代码4:
1 function widget(width) {
2 this.width = width;
3 this.show = function(){
4 alert(this.width);
5 }
6 }
7 var w = new widget("300px");
8 w.show();
看起来代码4更有可读性,方法和属性都放到一个function里了。。。但是, 常常采用代码3而弃代码4,
这样做的好处是:创建多个widget对象的时候,不必反复创建方法show()的副本。。。
---待续。。