javascript中的对象、类学习(转)

 一、 javascript类学习

    <script type="text/javascript">
function Car(sColor, iDOoors, Impg) {
this.color = sColor;
this.door = iDOoors;
this.mpg = Impg;
this.drivers = new Array("Mike", "Sue");
this.method = carMethod;
}
function carMethod(){
alert(carMethod);
}

var car1 = new Car("red", "2", 23);
var car2 = new Car("green", "4", 25);
Car.prototype.showColor
= function () {
alert(
this.color);
}

car1.drivers.push(
"Matt");
alert(car1.drivers);
alert(car2.drivers);
car1.showColor();
car2.showColor();

</script>

上面代码几点说明的:

1.类中的属性开发人员可以按照需要自己定义。  this.attr='xxx'

2.对于新建的类的方法时

    2.1 使用Prototype方法。 Car.prototype.showColor = function () {..}

    2.2 直接定义  this.method = carMethod;

3.新建一个对象时,使用var xxxx=new 类名,当var 用类名代替时会报错。

 

二、Javascript 对象学习

一、普通对象

      日期对象:var tmpDate = new Date();

  用户自定义对象 var person=new object(); 或 var peson={...}

      数字对象:var tmpDate = new Number()

 

重点:用户自定义对象详解

 1、javascript的object数据类型,并不像c# 是通过类创建对象,一个类相当于创建对象的模板,固定死了该对象的属性和方法。我们不能在运行时增加对象方法和属性(只能编译时通过继承来实现)

而JavaScript没有类的定义,创建对象没有固定模板,可以动态增加新的属性和方法

var Programmer = new Object(); 
Programmer.name = "Charles";
Programmer.age = 21;
alert(Programmer.name + " : " + Programmer.age);

2、JavaScript对象可以看成一组健/值对的集合,可以通过[]来操作,如果一个属性没有创建,将返回"undefined"。

var Programmer = new Object(); 
Programmer["name"] = "Charles";
Programmer["age"]= 21;
Programmer.speak=function(){ alert(this.name + " : " + this["age"]); }
Programmer.speak();

3、javascript对象也可以用{}来表示

var Programmer = 
{
name : "Charle",
age : 21,
speak : function(){ alert(this.name + " : " + this.age); }
}
Programmer.speak();

4、Json是一个轻量级的数据交换格式,同时也易于机器解释和生成,JSON允许在互联网上交换数据,我们可以用eval()方法把json对象转换成javascript对象。

var ProgrammerJSON="({name: CharlesChen,age : 21})"; 
var p = eval(ProgrammerJSON);
alert(p.name + ',' + p.age);

 


 

二、方法对象 

 

方法对象就是我们通常说的Function对象,在Javascript中,方法的确是被当作对象来处理的。

function func() {alert('Hello!');} 
alert(func.toString());

在这个例子中,func虽然是作为一个方法定义的,但它自身却包含一个toString()方法。

说明func在这里是被当作一个对象来处理的,更准确的说是一个"方法对象"

func.name = "I am func."; 
alert(func.name);

我们可以为func设置属性,这更是证明了func是一个对象。

 

方法对象和普通对象区别:

1、方法对象在后面加括号,就是执行。 如“func()”

2、方法对象由上两例可知,也能作为普通对象存在。(可以设置属性,执行tostring方法)

与C#比较,在C#中方法必须在某个类中定义,而不能单独存在,但js中方法对象可以独立,像普通对象一样被引用和传递。

其实c#,如果需要对方法进行引用和传递,只能通过代理方式进行了。

举例:

   <script type="text/javascript">
function func() { alert('Hello!'); }
function Invoke(f) {
f();
}
Invoke(func);
//将方法对象当作参数传递
</script>

 

总结1:方法对象(function)在JS中即有普通对象特征,又能加括号直接执行,因此可以在JS中随意引用和传递

 

 

 

 

 

除了可以被执行以外,方法对象还有一个特殊的功用,就是它可以通过 new 关键字来创建普通对象。

每一个方法对象被创建后,都会自动拥有一个叫prototype(原型)的属性。 这个属性可以读和写。当我们用new的时候,prototype可以起作用,它的值(也是一个对象)所包含的所有属性,都会复制到新创建的对象上去

举例 

    <script type="text/javascript">
function func() { alert('Hello!'); }
func.prototype.name
= "prototype of func"
var f = new func();
alert(f.name);
</script>

执行过程: 先弹'Hello',再弹“prototype of func

为什么会执行func?

答:var f = new func(); 相当于“构造函数”  方法对象加括号相当于执行该方法

 

更详细举例

  <script type="text/javascript">
function func() {this.name="name has been changed" }
func.prototype.name
= "prototype of func"
var f = new func();
alert(f.name);
</script>

执行过程:弹出“name has been changed”

为什么不是“prototype of func”?

答:var f = new func(); 相当于“构造函数”,重写了name值

 

在 JavaScript 中,用 new 关键字创建对象是执行了下面三个步骤的:

  1. 创建一个新的普通对象;
  2. 将方法对象的 prototype 属性的所有属性复制到新的普通对象中去。
  3. 以新的普通对象作为上下文来执行方法对象。

对于"new func()"这样的语句,可以描述"从func创建一个新的对象", 总之,prototype唯一的特殊用处就是在创建新对象时,将其所有属性复制给新的普通对象。

 

总结2: 每一个方法对象被创建后,都会自动拥有一个叫prototype(原型)的属性,prototype唯一的特殊用处就是在创建新对象时(new func),将其所有属性复制给新的普通对象。

 

 

总结3: 通过方法对象prototype特性可以实现继承

 

继承举例:

  <script type="text/javascript">
var A = new Function();
A.prototype.hello
= function () { alert('Hello!'); }

var B = new A();// new A ()时,A的prototype的所有属性全部复制给对象B
B.hello();

</script>


 

这就是 JavaScript 的所谓"继承"了,其实质就是属性的拷贝,这里利用了 prototype 来实现。

    <script type="text/javascript">
var o = {}; // o是个object对象
o.eat = function () { return "I am eating." }
o.sleep
= function () { return "ZZZzzz" }
o.talk
= function () { return "Hi!" }
o.think
= function () { return "Hmmm" }

var Human = new Function(); // 我决定给它起名叫"人"。
Human.prototype = o; // 这个东西就代表了所有"人"的概念。

    //通过new human,将human对象的prototype属性也复制h对象
    var h = new Human(); // 当我发现其他同它一样的东西,
alert(h.talk()) // 我就知道它也是"人"了!

</script>


继承的举例:

1、建立一个普通对象

   var o={};

   o.sleep=function(){alert('i am sleep');}

2、将该普通对象附加到一个方法对象上

   var human=new Function();

   human.prototype=o;

3、在该方法对象上实例化出子对象

   var h=new human();  //new 的时候,human的prototype属性也复制了一份给对象h.

4、子对象可直接使用继承过来的属性

 h.sleep();

  

 

 

 

posted on 2012-04-06 14:50  俊树  阅读(735)  评论(0编辑  收藏  举报

导航