js学习二,所谓对象

对象的概念使你能够以一种更易理解的方式去组织你的信息。让
我们从创建一个雇员数据库的简单例子开始,然后利用我们课程
里学到的东西去实现一个比这复杂得多的,和我们的生活有关
的事:编写一个JavaScript虚拟宠物。

为了这个练习,让我们先不管如何把现代资本主义社会工人进行
对象化的方方面面,我们把每一个雇员当作一个具有属性与方法
的对象。每一个雇员有一个名字,职务,薪水,生日,地址等
属性。雇员可以被提升,去休假,换部门或者去下厨等。对象包
括了所有这些信息,而雇员对象就象是一个模板。每个雇员都有
这些属性如姓名,职务等,是属性值的不同使得不同的雇员得以
区分开来。

要创建你自己的对象,你需要从模板开始。在面向对象编程中模
板也称为对象的构造器。一旦你建立了模板,你就可以创建对象
的实例,就象这样:

    
var fred = new Employee("Fred Flintstone", 33, "Surface Miner", 20000);
var barney = new Employee("Barney Rubble", 33, "Slacker", 40000);
var boss = new Employee("Mr. Slate",50, "CEO", 1000000);

如果这几个实例已被创建,你可以做这些事情:

      
barney.promotion("Chief Slacker","10");
fred.fired();
boss.vacation(365);

这样就把Barney提升为‘首席懒鬼’并增加10%的薪水,炒掉
Fred,让首席执行官休上一年的假。

当然你得自己从属性开始编写对象构造器和方法,这里是雇员的
构造器:

      
function Employee(name, age, title, salary)
{
this.name = name;
this.age = age;
this.title = title;
this.salary = salary;
}

请注意构造器其实就是一个函数。在函数中我们需要给
this.property_name赋值,我们不直接给age赋值,而是给this.age
赋值,对姓名,职务等也一样。

你可以给构造函数传递参数 ,当象下面这个语句这样调用构造函
数时:

var barney = new Employee("Barney Rubble", 33, "Slacker", 40000);


... 然后在构造函数中的这条语句:

      
this.name = name;

... 我们就把这个雇员的名字设成了传递给雇员构造函数的参数
的值。

构造函数中使用的 "this" 关键字的原因是你可能一次创建多个雇
员实例。 为了让方法和构造函数正确工作,必须 清楚地告诉它
们到底是在对哪个雇员进行操作。这里的"this"所指的是 is: 你
正在创建的实例。下面我们讲讲方法的例子或许能让你理解得
更好。

方法只不过是加在对象上的函数。首先定义函数,然后把函数加
载到对象上(在对象的构造函数中)我们以promotion() 方法
为例:

      
function promotion(new_title,percent_raise)
{
var salary_increase = this.salary * percent_raise;
this.salary = this.salary + salary_increase;
this.title = new_title;
}

这个函数计算雇员的新工资并把新工资和新职位赋给雇员。
JavaScript通过使用"this"关键字知道你说的是哪个雇员,所以如
果有这个语句:

      
barney.promotion("Chief Slacker",10);

那 "this"就是指 is Barney. 这看起来确实有一点怪异,可能要
一段时间去适应它,但是一旦你开始以对象的眼光去思考,你马
上就能养成习惯了。

创建对象的最后一步就是把方法连到对象上。我刚才提到了,你
要在构造函数中做这个。你写完提升方法后,如果要把它连到雇
员对象上,就在构造函数里加上:

      
this.promotion = promotion;

下面是增加了提升方法的构造函数:

      
function Employee(name, age, title, salary)
{
this.name = name;
this.age = age;
this.title = title;
this.salary = salary;

this.promotion = promotion;
}

function promotion(new_title,percent_raise)
{
var salary_increase = this.salary * percent_raise;
this.salary = this.salary + salary_increase;
this.title = new_title;
}


如要增加其它信息,比如雇员的办公室,可以增加一个名为
"office"的属性。然后如果你想记录雇员换办公室的情况,你就创
建一个transfer()方法. 

明白了吗? 现在来看看更复杂和重要的面向对象的JavaScript, 去
创建一个虚拟宠物

你现在骄傲地拥有了不是一只而是两只虚拟宠物。你的责任就
是让它们保持健康。如果它们的健康值低于零,它们就会死掉。
按start 钮可以赋予它们生命. 
 

--------------------------------------------------------------------------------

Name: 
Status: 
 

Name: 
Status: 
 

 


--------------------------------------------------------------------------------
也许你能猜到,我并不是个称职的宠物饲养员,我的可怜的
宠物每次还没养大就死掉了。 
虽然如此,这整个都是用对象编出来的。每个宠物都是宠物
对象的一个实例。每个宠物具有以下属性: 

health健康 
happiness快乐 
hunger饥饿 
age年龄 
pet_name宠物的名字 
form_number -表单号--宠物所在的HTML表单号。 
下列方法能够影响这些属性: 

play() - 增加快乐 
feed() - 减少饥饿 
medicate() - 增加一点健康 
makeOlder() - 宠物长大 
display() - 在状态框里显示宠物的信息。 
把这些记在脑子里,我们来创建宠物对象。首先我们来写一
个构造函数。 这里就是最基本的构造函数(即还没有加任何
方法的代码): 
 
 


function Pet(the_pet_name, the_form_number)
{
this.age = 0;
this.hunger = Math.random() * 5; // random number between 0 and 4.99
this.health = Math.random() * 5 + 1 ; // random number between 1 and 3.99
this.happiness = Math.random() * 5;
this.pet_name = the_pet_name;
this.form_number = the_form_number;
window.document.forms[the_form_number].pet_name.value = the_pet_name;
}

这个构造函数有两个参数:宠物名字和要显示其信息的表单号。
要创建两个宠物,我们这么做: 
 
var pet1 = new Pet("barney",0);
var pet2 = new Pet("betty",1);

我们把构造函数写的能使每个宠物都不一样。用了
Math.random() 方法来产生一个0到1之间的随机数,
Math.random()方法并不是完全随机的,但在这里够用了,它
能保证给每个产生的宠物一个不同的饥饿,健康和快乐的初
始值。宠物的名字从参数传递过来,年龄则设为0。 最后两行
设定了宠物使用的表单号,并把宠物的名字写到相应的文本
框去。记住:一个页面的第一个表单可以被索引为
window.document.forms[0],第二个可以索引为
window.document.forms[1], 依次类推。

我们已建立好了属性,现在来看看方法。我并不打算把每个方
法都展开讲,而只把其中几个讲一讲: 
 

function feed()
 {
 var meal_quality = Math.random() * 2;
 this.hunger = this.hunger - meal_quality;
 if (this.hunger <0)
 {
 this.hunger = 0;
 }
 this.display();
 }


这是一个喂宠物的方法。如果你调用了 pet1.feed()方法,首
先它会产生一个0到2之间的数,然后把饥饿度减去这个数。
我们确使饥饿度不小于0,然后调用显示方法去显示信息。 
显示方法的代码如下: 
 

function display()
{
 var the_string = "";

 if (this.health < min_health)
 {
 the_string = this.pet_name + " IS DEAD!";
 } else {
 the_string += "Happiness " + parseInt(this.happiness);
 the_string += ". Health: " + parseInt(this.health);
 the_string += ". Hunger: " + parseInt(this.hunger);
 the_string += ". Age: " + parseInt(this.age);
 the_string += ".";
 }

 window.document.forms[this.form_number].pet_status.value = the_string;

This这个方法建立了一个字符串并把它显示到正确的文本框里,
表单号属性保证了状态信息放到合适的文本框。每当我们创建
一个宠物,我们就给它一个表单号 - 第一个宠物的表单号是0,
第二个宠物的表单号是1。使用这种表单号我们知道第一个宠物

的状态应放在 window.document.forms[0].pet_status.value,
而第二个宠物的状态应放在window.document.forms
[1].pet_status.value. 这个方法里的最后一行根据
this.form_number决定在哪个form放状态信息. 
这个方法里的另一个有趣的地方是 parseInt函数. 由于使用了
随机数,象健康和快乐的值可能是 2.738993720. 它们是实数,
但是显得有点长,所以parseInt函数把小数点后的数给拿掉了,
比如 parseInt(2.738)得到的结果是2。

第三个有趣的方法是makeOlder().它把宠物年龄增加一岁并让
宠物更饿一点和更不高兴一点。这个方法通过setTimeout设成
每秒被调用一次(我们在第三天的课里曾讲过怎么做的): 
 

function makeOlder()
{

var max_hunger = 5;
var good_happiness = 5; 

if (this.health > min_health)
{

this.age +=1;
this.happiness -= Math.random() * 2;
this.hunger += Math.random() * 2;
if (this.hunger > max_hunger)
{
this.health -= Math.random() * 2;
this.happiness -= Math.random() * 2;
}

}

this.display();
}

你能看到,这个方法把宠物的年龄增加一岁,把快乐值降低了
一个随机数,把饥饿度增加了一个随机数。然后又设定了一些
规则(这儿只示意了一个),如“如果宠物真的饿极了,就让
它不快乐一点和不健康一点。 
既然我们已经有了这些方法,就把它放进到构造函数里去完成
整个的虚拟宠物对象的创建: 
 

function Pet(the_pet_name, the_form_number)
{
this.age = 0;
this.hunger = Math.random() * 5; // random number between 0 and 4.99
this.health = Math.random() * 3 +1 ; // random number between 1 and 3.99
this.happiness = Math.random() * 5;
this.pet_name = the_pet_name;
this.form_number = the_form_number;

this.feed = feed;
this.play = play;
this.medicate = medicate;
this.display = display;
this.makeOlder = makeOlder;

window.document.forms[the_form_number].pet_name.value = the_pet_name;
this.display();
}

最后设定让makeOlder()方法每三秒种就调用一次。这个函数
在你按动start按钮时被调用。 


function moveTime()
{
pet1.makeOlder();
pet2.makeOlder();
the_time_out = setTimeout("moveTime();", 3000);
}

你可以看到这个函数调用了每个宠物的makeOlder()方法,并
在三秒种后又调用了它自己。这个定时事件将一直持续下去
直到用户通过clearTimeout(the_time_out)把它取消掉. 
这个例子几乎用到了我们今天讲到的所有内容。如果你理
解了,你对JavaScript已经了解的很深入了。在我们进入最
后一个话题之前再休息一下,最后要讲的是:利用JavaScript
的快捷方式获取很难索引的对象

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: JavaScript中的对象是一种无序的键/值对集合。您可以使用对象来存储任意数据类型,并且可以使用键来访问这些数据。 创建对象的方式有多种,其中一种是使用对象字面量语法: ``` let obj = { key1: value1, key2: value2, ... }; ``` 您也可以使用构造函数来创建对象: ``` let obj = new Object(); obj.key1 = value1; obj.key2 = value2; ... ``` JavaScript还提供了一种称为原型的机制,可以在一个对象的基础上创建新对象。您可以使用Object.create()来创建一个对象,并将其关联到另一个对象: ``` let obj1 = {key1: value1}; let obj2 = Object.create(obj1); ``` 访问对象中的值可以使用点语法或中括号语法: ``` console.log(obj.key1); console.log(obj['key1']); ``` 对象可以嵌套,创建多级对象 ``` let obj = { key1: { key2: { key3: value } } }; ``` JavaScript还提供了一种称为原型的机制,可以在一个对象的基础上创建新对象。 ### 回答2: JavaScript是一种重要的脚本语言,它的强大之处在于它的对象。可以把JavaScript对象看作是创建Web应用程序的基石。 JavaScript对象是一种复合数据类型,由属性和方法组成。每个对象都包含一组属性和方法,它们可以通过对象名字来调用或者访问。对象可以创造新的属性和方法,也可以从其他对象继承属性和方法。JavaScript提供的对象类型有三种:原始对象、内置对象和宿主对象。 原始对象是指通过原型链创建的对象,它由用户自己定义或系统预定义的对象来创建。内置对象是指由JavaScript语言预定义的对象类型,这些对象JavaScript的核心,在任何JavaScript环境下都可以使用。宿主对象是指由浏览器或服务器环境提供的对象类型,可以用来操作系统、浏览器或者其他外部环境。 对象JavaScript的核心概念之一,所以对于JavaScript初学者来说,学习对象是非常重要的。在学习对象之前,需要先掌握基本的语法和编程概念,例如变量、函数和循环等。在学习对象之后,可以掌握面向对象编程的思想,用对象的方式来组织和管理代码,使得代码更加清晰和易于维护。 总之,学习JavaScript对象是非常重要的,因为它们是JavaScript编程的核心和基石。掌握JavaScript对象可以让你更好地理解JavaScript编程的本质,从而更好地开发Web应用程序。 ### 回答3: JavaScript是一门面向对象的语言,它的核心特性之一就是对象JS对象是一组属性的集合,每个属性都由一个字符串和一个值组成,这个值可以是函数。对象可用于封装数据和功能,以及创建可重复使用的代码块,从而实现更高效的编程。 在JavaScript中,对象的创建方式有两种:字面量和构造函数。字面量方式创建对象非常简单,只需要按照对象的键-值对方式来书写,如下所示: ```javascript var person = { name: 'Alice', age: 20, sayHello: function() { console.log("Hello, I'm "+this.name); } } ``` 上述代码中,我们定义了一个名为`person`的对象,它有两个属性`name`和`age`,以及一个方法`sayHello`。使用字面量方式创建对象,我们可以很方便地定义对象的初始状态。 另一种创建对象的方式是构造函数。构造函数本质上是一种特殊的函数,以函数的形式返回一个新的对象,实现对象的构建。`new`操作符用来创建对象的实例,如下所示: ```javascript function Person(name, age) { this.name = name; this.age = age; this.sayHello = function() { console.log("Hello, I'm "+this.name); }; } var person1 = new Person('Bob', 30); var person2 = new Person('Charlie', 40); ``` 在上述代码中,我们创建了一个名为`Person`的构造函数,这个函数接受两个参数`name`和`age`,并将它们赋值给对象属性。使用`new`操作符创建实例`person1`和`person2`时,会执行构造函数,并返回一个新的对象。 除了创建对象JavaScript还提供了一些内置对象,如`Math`、`Date`、`String`、`Array`等。这些内置对象提供了一些预定义的属性和方法,使得编写JavaScript代码更加高效和简便。 总而言之,理解JavaScript对象及其使用方式是非常重要的,因为大多数JavaScript代码都是围绕对象进行的。只有深入了解对象,才能更好地进行JavaScript编程。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值