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 关键字创建对象是执行了下面三个步骤的:
- 创建一个新的普通对象;
- 将方法对象的 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>
这就是 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();