第六章:JavaScript面向对象编程

1.创建一个对象

创建一个Cat类:

function Cat()
{
}
//如果这样用
//Cat(); //Cat是函数
var cat1 = new Cat();
cat1.name = "小白";
cat1.age = 3;
cat1.color ="白色";
从上面的代码可以看出:
JS中对象的属性可以动态的添加;
对象的属性的数据类型没有限制。
特别说明:在JS中一切都是对象,类(如上面的Cat类)其实也是对象,它实际上是function类的一个实例,通过类,我们可以创建自己的对象实例。

对于比较简单的对象,也可以这样创建:

var dog = {name: "小明",sayHello:function(a,b){window.alert("结果 = " + (a+b));}}
window.alert(dog.name);
window.alert(dog["name"]);
dog.sayHello(200,50);
这样创建对象时,实际上是系统调用了Object类。

2.如何使用对象实例的成员变量

1.对象实例名.属性名;
2.对象实例名[“属性名”],此方法可以实现动态的访问变量。
function Person()
{
}

var p1 = new Person();
p1.name = "cuizhiquan";
window.alert(p1.name);
var val = "na" + "me";
window.alert(p1[val]);    //实现动态访问
delete p1.name; //删除p1对象的name属性

3.this关键字

通过上面的方法,每创建一个对象实例后,动态的添加属性,该属性只被该对象实例拥有,其他对象实例并不能拥有该属性,在实际编程中,我们可能有这样的需求,当我们创建一个对象后,就希望该对象自动拥有某些属性,这时我们就会用到this关键字。
function Person()
{
    this.name = "abc";
    this.age = 90;
}
var p1 = new Person();
var p2 =new Person();
p2.name = "cuizhiquan";
通过这种方式,创建对象实例p1、p2后,p1、p2自动拥有name和age属性,当给p2的name属性赋值"cuizhiquan"后,会覆盖掉创建类时name属性的初始值“abc”。
不能像下面这样定义类的属性:
function Person()
{
    var name = "abc";
    var age = 90;
}
这样name和age只能称为在类或函数Person内定义的普通局部变量,出了类或函数的花括号,将不能被访问。
this关键字的另一个作用就是指向当前对象,类似于Java。

4.创建成员函数的四种方法

1、使用this关键字
function Person()
{
    var name = "abc";
    var age = 900;
    this.show=function()
    {
        window.alert(name+"   "+age);    
    }
}

var p1 = new Person();
p1.show();
2.外部定义函数后,动态绑定到对象实例
function Person()
{
    this.name = "abc";
    this.age = 900;
}
function show()
{
    window.alert(name+" "+age);
}
var p=new Person();
p.abc=show;
p.abc();
3.在动态绑定时,定义函数
function Person()
{
    this.name = "abc";
    this.age = 900;
}
var p = Person();
p.abc = function show()
{
   window.alert(name+" "+age);
}
p.abc();
4.原型法
前面三种方法存在问题,第一种方法,每个对象都有相同的一段函数代码,这样如果对象很多,则会影响效率,第二种和第三种方法给对象实例绑定了相应方法后,只有该对象实例具有该方法,其他对象实例如果需要该方法还需再次绑定,这样绑定了该方法的对象实例,都会分别拥有一段相同的代码,如果对象很多,也会影响效率,原型法用来解决这个问题:
function Dog()
{
}
var dog1 = new Dog();
Dog.prototype.shout=function()
{
    window.alert("小狗");
}
dog1.shout();
var dog2 = new Dog();
dog2.shout();
通过上面的原型法,shout方法,会被放在代码区,让所有对象实例共享,提高效率。

5.Object类

Object类是所有JavaScript类的基类,提供了一种创建自定义对象的简单方式,不需要程序员再定义构造函数:
var p = new Object();
p.name = "cuizhiquan";
Object类的主要属性:
  1. constructor:对象的构造函数;
  2. prototype:获得类的prototype对象。
Object类的主要方法:
  1. hasOwnProperty(property):是否属于本类定义的属性;
  2. isPrototypeOf(object):是否是指定类的prototype;
  3. propertyIsEnumerable(property):是否是可列举的属性;
  4. toString():返回对象对应的字符串;
  5. valueOf():返回对象对应的原始类型值。

6.构造函数

构造函数是一种特殊的方法,它的主要作用是完成对对象实例的初始化。它有几个特点:
  1. 构造函数名和类名相同;
  2. 在创建一个对象实例时,系统会自动的调用该类的构造方法完成对新对象的初始化。
在对象初始化时,不仅可以给属性赋值,而且可以赋给对象一个函数:
function jisuan(num1,num2,oper)
{
    if(oper == "+")
    {
        return num1+num2;
    }else if(oper == "-")
             {
                  return num1-num2;
             }else if(oper == "*")
                      {
                           return num1*num2;
                       }else
                           {
                                return num1/num2;
                           }
}
function Person(name,age,fun)
{
    this.name = name;
    this.age = age;
    this.fun = fun;
}
var p = new Person("aa",90,jisuan);
window.alert(p.name + " " + p.age);
window.alert(p.fun(200,50,+));

7.对for...in 的进一步认识

for...in 不仅可以遍历数组,而且可以列出对象的所有属性和方法,例如下面的代码列出window对象的所有属性和方法:
for(var key in window)
{
    document.writeln(key+":"+window["key"]+"<br/>")
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值