javascript中的对象、类学习(转) 好文章,看明白了很多概念

来源:互联网 发布:mac怎么删除flash 编辑:程序博客网 时间:2024/06/05 20:40



http://www.cnblogs.com/lindaWei/archive/2012/04/06/2434688.html


 一、 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>
复制代码


 /////////

Function()构造函数 

注意:尽管可以使用 Function 构造函数创建函数,但最好不要使用它,因为用它定义函数比用传统方式要慢得多。不过,所有函数都应看作 Function 类的实例 。 
如果你定义的函数没有参数,那么可以只需给构造函数传递一个字符串(即函数的主体)即可。 
注意:传递给构造函数Function()的参数中没有一个用于说明它要创建的函数名。用Function()构造函数创建的未命名函数有时被称为“匿名函数”。 
Function()函数允许我们动态地建立和编译一个函数,它不会将我们限制在function语句预编译的函数体中

////////


这就是 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();


0 0
原创粉丝点击