当前位置: 代码迷 >> JavaScript >> js面向对象基础(收拾)
  详细解决方案

js面向对象基础(收拾)

热度:406   发布时间:2012-11-01 11:11:31.0
js面向对象基础(整理)

声明:下面的都是在je论坛上看到的,在这里整理了一下。

?

什么才算javascript中的对象:


?? a、基本数据类型的包装对象。例如String Number Boolean.建议直接用var s=""; var i=1; var b=false;定义,包装类与java中的包装类不同。javascript中不要用包装类。
?? b、javascript预定义的对象。Function Array Date?? RegExp? Error等对象。
?? c、用new Object()创建的对象。等同与var o={a:0,b:'s'};
?? d、用自定义的构造函数创建的对象。function O(){};? var o=new O();
?? e、dom模型定义的构造函数,浏览器为你创建的对象。用var o=document.getElementById();或其他方法获得。
?? f、null也是对象。typeof(null)= object.undefined 可以理解为变量预编译的初始化值,而null是特殊的对象。如果一个变量=null,说明这个变量是个对象,但不是我上面 提到的任何来源方式的对象。 如document.getElementById(页面中不存在的id);可以产生一个null对象。
?? 用typeof()? 方法返回的是 object 的变量都是对象。 Function除外用new定义的不一定都是对象。

?

在一个自定义“类”中有中有几个地方可以定义属性。
?? a、函数名中直接定义。? 如Person.name。在这定义相当于类名的属性。静态的,访问的时候必须用Person.name来访问,不能用new Person().name访问,也访问不到。
?? b、构造函数的this.中。当你用new function()时,这些属性就是你所持对象的属性。用new Person().属性? 来访问。
?? c、构建好对象以后,给对象增加属性。和构造函数中的属性使用类似。
?? d、函数名的prototype中
?? e、父类或Object 的prototype中。(注释: 可用prototype为函数动态新增函数属性与方法 ,相当于对象的属性 )?

?

在prototype中的都是属于对象的公有(方法/属性)

?

静态方法中可以用this.属性来引用静态属性,也可以用类名.属性来应用;对象的方法引用静态变量,只能用类名.属性;

?

JS中面向对象的5中写法

?

//第1种写法
function Circle(r) {
      this.r = r;
}
Circle.PI = 3.14159;
Circle.prototype.area = function() {
  return Circle.PI * this.r * this.r;
}

var c = new Circle(1.0);   
alert(c.area()); 

?

//第2种写法
var Circle = function() {
   var obj = new Object();
   obj.PI = 3.14159;
   
   obj.area = function( r ) {
       return this.PI * r * r;
   }
   return obj;
}

var c = new Circle();
alert( c.area( 1.0 ) );

?

//第3种写法
var Circle = new Object();
Circle.PI = 3.14159;
Circle.Area = function( r ) {
       return this.PI * r * r;
}

alert( Circle.Area( 1.0 ) );

?

//第4种写法
var Circle={
   "PI":3.14159,
 "area":function(r){
          return this.PI * r * r;
        }
};
alert( Circle.area(1.0) );

?

Java 代码?
  1. //第5种写法 ??
  2. var?Circle?=?new ?Function( "this.PI?=?3.14159;this.area?=?function(?r?)?{return?r*r*this.PI;}" );??
  3. ??
  4. alert(?(new ?Circle()).area( 1.0 )?);?
第1种:
优点:体现了OO的继承特性. 每次初始化Circle对象,都只设置了必须的值(r).

第2种:
缺点:每次都必须初始化很多变量,时间成本+内存成本,相比第一种高昂了点.

第3种:
缺点:虽然实现了封装,但貌似Circle只是一个包名,对于OO的继承好像发挥不大.

第4种:
缺点:同第3种. 只是用了Object Literal方式初始化了对象.

第5种:
缺点:代码编写,确实不方便.没体现更好的分离.

个人觉得第一种更符合OO开发要求!
第四种适合可以理解成封包! 且非常灵活,本身就是一种json格式,所以方便应用于json格式传递环境下,eg:ExtJs就是采用了第一种方式封装核心,第四种方式打包UI

看了大家的回复之后,发觉第一种和第四种是大家常接触的。

//第1种写法
function Circle(r) {
????? this.r = r;
}
Circle.PI = 3.14159;
Circle.prototype.area = function() {
? return Circle.PI * this.r * this.r;
}

var c = new Circle(1.0);??
alert(c.area());


//第4种写法
var Circle={
?? "PI":3.14159,
"area":function(r){
????????? return this.PI * r * r;
??????? }
};
alert( Circle.area(1.0) );

第一种从java角度来说,是一个普通的类,这个类需要调用的时候,就new xx()这样一个对象出来。

第四种,从java的角度来 说,是一个单例类!你调用的时候直接XXX.xx()这样调用,不需要new。

如果你可以理解普通的类,跟单例类的概念,你应该就可以明 白什么类应该是什么用法了。

这2种写法是最常见的,也是推荐的写法。其它的,比较非主流吧。至于第五种,算是垃圾写法 吧,Function效率很低。


1种最规范,不过现在偷懒用2,代码少点。
3,4好像没有内部变量,经常有问题(个人经验)。
5.看就知道,类不能大,代码多了没法读,代码少时候用不错。


这应该也算一种
var Circle=function(){??
??? PI = 3.14159;
??? return {
??????? area : function(r){
??????????? return this.PI * r * r;
??????? }
??? }
}(); ?????
alert( Circle.area(1.0) );?