面向对象
类:具有相同特性的一对对象组成的群体
对象:一个具体的人或物
类与对象的关系:类是对象的抽象、对象是类的实例
//对象
//声明以下对象
//1.对象:豌豆射手
var Peashooter = {
name: "豌豆射手",
game: "植物大战僵尸",
hurt: "普通",
cost: 100,
burial:"快",
introduce:" 一株植物如何才能在快速生长和射击豌豆方面如此突出?豌豆射手说:“勤奋工作、承担责任,以及一份健康的早餐:阳光与高纤维二氧化碳的合理搭配,这就是我的秘诀。”"
}
//2.对象:坚果墙
var GourdWall = {
name: "坚果墙",
game: "植物大战僵尸",
hurt: "普通",
cost: 50,
burial: "慢",
introduce: "“人们问我,长时间地被僵尸啃来啃去是什么感觉。”墙果说,“他们不了解的是,由于触觉不发达,我能够感受到的只是轻微的刺痛——就像有人给你做背部按摩一样。”"
}
//3.对象:火炬树桩
var Torchwood = {
name: "火炬树桩",
game: "植物大战僵尸",
hurt: "普通",
cost: 175,
burial: "慢",
introduce: " 火炬树桩受到众人的敬爱,只因他的诚实正直、牢不可破的友谊,以及增强豌豆伤害的能力。但火炬树桩也有个秘密:他不识字。"
}
以上多个对象,都具有相同的属性(相同特性)
每一次都声明出一个对象,很麻烦
所以可以使用类来简写
//从多个对象中提炼类:类是对象的抽象
function Plant(name, game, hurt, cost, burial, introduce){
this.name = name;
this.game = game;
this.hurt = hurt;
this.cost = cost;
this.burial = burial;
this.introduce = introduce;
}
var Sunflower=new Plant("向日葵","植物大战僵尸","普通",50,"慢","向日葵很难不随着拍子起舞——究竟是什么拍子呢?嗯,这是大地母亲那赐予生命的爵士节奏,它独有的音调只有向日葵才听得到。")
console.log(Peashooter.name)//豌豆射手
console.log(Sunflower.name)//向日葵
//两种声明方式得到的对象,在使用上没有区别
console.log(Peashooter)
console.log(Sunflower)
实际开发中,先有类再有对象
先要构思好,通过这个类实例化而来的对象,所有具备的特点
通过这些特点设置,类的属性
进而通过类,实例化出对象
function Zombie(name,hurt,health,speed){
this.name = name;
this.hurt = hurt;
this.health = health;
this.speed = speed;
this.attack = function(){
console.log(this.name + " attack");
}
}
var ordinary_zombie = new Zombie("Ordinary_Zombie",10,100,10);
ordinary_zombie.attack();
//方法是属性的一种,属性值是函数
//需要实例化是提供具体值,则设置参数
//不需要的则在类例面直接赋值
看看下面的这些代码:
function Zombie(name,hurt,health,speed){
this.name = name;
this.hurt = hurt;
this.health = health;
this.speed = speed;
this.attack = function(){
console.log(this.name + " attack");
}
}
var zombie=new Zombie("僵尸",10,100,10);
var flag_zombie=new Zombie("旗帜僵尸",10,100,15);
zombie.attack();
flag_zombie.attack();
//两个对象的attack方法,从方法名到担当体都是一样的
//是不是同一个方法?
console.log(zombie.attack==flag_zombie.attack);//false
两个一模一样的方法,不是同一个方法
后果:浪费内存
那么,如果我们想要让两个对象的attack方法是同一个方法,该怎么办?
在思考这个问题之前,先思考一下为什么是两个方法
new 到底做了什么?
首先,Zombie的本体是一个函数
直接调用会怎么样?
var zombie=Zombie("僵尸",10,100,10)
console.log(zombie);//undefined
console.log(zombie.name)//报错
zombie.attack();//报错
由于方法没有返回值,所以zombie是undefined
值不会凭空消失,会去哪里?
也就是说没有new时,方法中的this.name在哪?
答:在window对象中