日期:2014-05-16  浏览次数:20358 次

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;
}