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 关键字创建对象是执行了下面三个步骤的:
- 创建一个新的普通对象;
- 将方法对象的 prototype 属性的所有属性复制到新的普通对象中去。
- 以新的普通对象作为上下文来执行方法对象。
对于"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();