面向对象

类:具有相同特性的一对对象组成的群体

对象:一个具体的人或物

类与对象的关系:类是对象的抽象、对象是类的实例

//对象
//声明以下对象
//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对象中

03-17 16:45