类的概念

某一类的事物的高度抽象,在类里设定了一些这类事物共有的特性和方法.

  • 人类就是人的高度抽象,人类拥有的语言,学习,开车等特性和方法
  • 交通工具就是汽车,轮船,飞机等等的高度抽象的概念.交通工具有行驶,载物等特性和方法

实例对象

某一类事物的具体表现,它是一系列拥有值的具体属性的集合.例如

  • 小明是一个人,它属于人类的具体表现.他就拥有具体的身高,具体的姓名,具体的体重,他能够学习,玩游戏等行为.
  • 我的自行车,它就是交通工具的具体表现.它有具体的重量,尺寸,它能载货等等行为

万事万物皆对象

所有拥有一系列属性以及对应值的集合就是对象.这种例子,在现实生活中数不胜数

  • 冰箱拥有尺寸,重量,它能制冷,保险.所以冰箱就是一个对象.
  • 电视拥有尺寸,重量,它能播放电视节目.所以冰箱也是一个对象
  • 空气质量微乎其微,但是它有组成的部分,它能提供人们赖以生存的氧气等

javascript对象

在javascript中,对象就是实例对象.js对象的属性都会包裹在 {} 里,属性名和属性值以键值对的形式组合,属性和属性之间用逗号隔开. 以冰箱为例

{
   尺寸: 50寸,
   重量: 200,
   价格: 900,
   品牌: 奥玛
}

但是我们在编写程序的过程中,是不建议使用中文作为属性名或者变量名的.如果英文不够,你可以考虑用拼音来凑.所以以上例子我们应该改为

{
    size: 50,
    weight: 200,
    price: 900,
    brand: "奥玛冰箱"
}

javascript创建对象的方式

字面量方式创建

字面量方式是最为直观和简单的创建对象方式,我们可以一看就看出该对象里有哪些属性和方法

var obj = {
    brand: "奥玛",//品牌
    size: 60,//尺寸
    price: 900,//价格
}

对象的访问方式

  • 点语法,通过对象名.属性名的方式访问
    var obj = {
      brand: "奥玛",//品牌
      size: 60,//尺寸
      price: 900,//价格
    }
    console.log(obj.brand); //访问obj对象的brand属性
    
  • 字符串语法,通过 对象名["属性名"]的方式访问
    var obj = {
      brand: "奥玛",//品牌
      size: 60,//尺寸
      price: 900,//价格
    }
    console.log(obj["brand"]); //访问obj对象的brand属性
    
    注意,很多时候这两种访问属性的方式可以互相转换,但是有一下情况,就只能用字符串模式
    var obj = {
      brand: "奥玛",//品牌
      size: 60,//尺寸
      price: 900,//价格
    }
    var name = obj.brand;//将对象的属性赋值给一个变量name
    //如果通过obj.name的方式访问,可到结果是undefined
    console.log(obj.name);//这句话的意思就是 访问 obj里的name属性,但是obj对象里,并没有一个叫name的属性,所以得到的结果是undefined;
    //字符串方式访问
    console.log(obj[name]);//等价于 obj["brand"]
    

为对象添加新的属性

和访问值一样,也是两种一样的方式.

var obj = {
    brand: "奥玛",//品牌
    size: 60,//尺寸
    price: 900,//价格
}
// 通过点语法,为obj对象新增一个耗能等级属性.
obj.level = 1; 
console.log("访问obj的level属性"+obj.level);
// 通过字符串语法,为obj对象新增一个doors属性,表示有多少门
obj["doors"] = 3;
console.log(obj.doors); //3
  • Object() 方法
var obj = new Object();
obj.name = "tomcat";
console.log(obj.name);

以上两种创建对象的方式是最简单方便的.但是这两种创建对象的方式在创建多个拥有同样属性的对象的时候,需要编写大量的重复代码,例如

// 冰箱拥有的属性是一样的
// 美的冰箱
var meidi = {
    brand: "美的",//品牌
    size: 60,//尺寸
    price: 900,//价格
}
//奥玛冰箱
var aoma = {
    brand: "奥玛",//品牌
    size: 60,//尺寸
    price: 900,//价格
}

工厂方法

所谓工厂,就是我们只需要告诉工厂,我们要什么,需要什么特点.然后工厂帮我们生产,生产完成之后再给我们一个成品.而工厂方法就是将创建对象的代码放到一个工厂方法里进行,通过调用工厂方法得到需要的对象.

工厂方法的出现是为了解决创建同类型对象产生大量代码的问题.

    // 定义一个工厂方法
    function 工厂方法名(形参列表){
        var obj = new Object();
        // 根据传递进来的实参,为obj设置相应的属性

        //将创建好的对象返回给调用者
        return obj;
    }

声明一个创建冰箱的工厂方法

// 冰箱工厂方法
function FridgeFactory(brand,size,level){
    var fridge = new Object();
    fridge.brand = brand;
    fridge.size = size;
    fridge.level = level;
}

// 生产美的冰箱
var medi = FridgeFactory("meidi",50,1);
// 生产奥玛冰箱
var aoma = FridgeFactory("aoma",60,1);

以上示例,我们除了在声明工厂方法的时候,代码多一些外.无论我们创建多少个冰箱对象,都只需要很简单的一行代码即可.但这种方法依然会有一个问题,如果我们需要判断对象的类型.工厂方法是无法判断,例如我们用typeof,得到的结果都是object;

console.log(typeof medi); //object

因此我们需要一种可以判断对象类型的方法.

构造函数

构造函数和工厂方法都属于通过函数来创建对象.但是构造函数本身不回去创建对象,而是通过js提供的new方法来创建对象

function Fridge(brand,size,level){
    this.brand = brand;
    this.size = size;
    this.level = level;
}

var medi = new Fridge("meidi",50,1);
var aoma = new Fridge("aoma",60,1);

this

在上面的构造函数中,出现this关键字.该this表示的是通过构造函数Fridge的实例本身.

 function Fridge(brand,size,level){
    //表示为创建出来的实例对象,设置brand属性,而属性的值就是通过
    //new的时候调用构造函数传递进来的实际参数
    this.brand = brand;
    this.size = size;
    this.level = level;
}
// this就表示是meidi对象
var meidi = new Fridge("meidi",50,1);
//this表示的是aoma对象
var aoma = new Fridge("aoma",60,1);

以上就是我们常用的创建对象的方式.由于学习进度的问题,还有两种主要创建对象方式,例如Object.create()和class的方式创建对象,我们学习到后面相关的知识点之后再去使用.

属性描述对象

目前为止,我们几乎可以对对象的属性为所欲为.我想改就改,我删除就删除.例如

var aoma = {
    brand: "奥玛",//品牌
    size: 60,//尺寸
    price: 900,//价格
}

// 修改price的价格
aoma.price = 1024;
console.log(aoma);//aoma对象的价格发生了变化
// 给aoma对象新增一个属性
aoma.color = "lightgray";
console.log(aoma); //输出的对象内容了多了一个color
// 删除对象里的size属性
delete aoma.price; //把aoam对象里的价格删掉
console.log(aoma);//输出的结果少了一个price

从上面代码来看,我们真的几乎可以对aoma对象里属性做任何操作了.有些属性无所谓,但是有些属性却不能随意删除和修改.为了避免这种情况,我们可以通过以下的方式定义对象的属性.

Object.defineProperty

使用方式

    Object.defineProperty(目标对象,"属性名称",描述对象)
    目标对象: 你需要给哪个对象设置属性
    属性名称: 给对象设置的属性名称
    描述对象:
        - 属性描述对象
        - 属性存取描述对象
var aoma = {
    size: 60,//尺寸
    price: 900,//价格
}
// 给aoma对象设置一个品牌属性
Object.defineProperty(aoma,"brand",{
    // 在这里对brand属性进行描述
})

属性描述对象

从名字上面看就知道该对象是对属性的描述.描述有以下内容:

  • value,属性的值
  • writable 可写描述.默认值为false,如果设置为false,则表示不能修改属性的值.
  • configurable 可配置描述.默认值为false,如果为true,则表示可删除
  • enumrable 可遍历,是否可以通过for循环进行遍历
var aoma = {
    size: 60,//尺寸
    price: 900,//价格
}
// 给aoma对象设置一个品牌属性
Object.defineProperty(aoma,"brand",{
    // 在这里对brand属性进行描述
    value: "奥玛",
    writable: true,
    configurable:true,
    enumrable: true
})
console.log(aoma.brand); //输出结果 "奥玛"
aoma.brand = "美的";
console.log(aoma.brand);//品牌变成了 "美的"
delete aoma.brand;
consoel.log(aoma.brand);//brand又被删除了,所有输出结果是undefined
//遍历aoma对象里有哪些属性
for(var key in aoma){
    console.log(key);
}
var aoma = {
    size: 60,//尺寸
    price: 900,//价格
}
// 给aoma对象设置一个品牌属性
Object.defineProperty(aoma,"brand",{
    // 在这里对brand属性进行描述
    value: "奥玛",
    writable: false,
    configurable:false,
    enumrable: false
})
console.log(aoma.brand); //输出结果 "奥玛"
aoma.brand = "美的";//试图修改
console.log(aoma.brand);//输出结果依然是 "奥玛"
delete aoma.brand; //试图删除brand
consoel.log(aoma.brand);//删除失败,输出结果依然是美的
//遍历aoma对象里有哪些属性
for(var key in aoma){
    console.log(key);//除了brand 其他属性都被遍历出来了
}

存取描述对象

当我们去访问对象的属性的时候,发生了什么?我们可以通过存取描述对象进行了解.从名字上来,我们就知道该对象涉及到的是属性的设置和获取.需要注意的是,存取描述对象和属性描述对象是不能同时存储在,否则报错.

存取描述对象里有两个属性

  • get方法.当我们访问对象属性的时候,实际上访问的就是系统提供的默认的get方法.但是我们可以通过在存取描述对象里重写这个方法,以达到我们想要的结果

  • set函数:当为对象的属性设置值的时候,就会触发该函数.同样我们也可以在属性描述对象里重写该对象

示例 访问对象的属性

var aoma = {
    size: 60,//尺寸
    price: 900,//价格
}
// 给aoma对象设置一个品牌属性
Object.defineProperty(aoma,"brand",{
    // get方法必须通过return
    get:function(){
        console.log("当访问brand属性的时候,我会被处罚");
        return "01奥玛"
    }
})
console.log(aoma.brand);
/*
输出结果
1. 当访问brand属性的时候,我会被处罚
2. 01奥玛
*/

设置对象的属性

var aoma = {
    size: 60,//尺寸
    price: 900,//价格
}

// 给aoma对象设置一个品牌属性
Object.defineProperty(aoma,"brand",{
    get:function(){
      //由于brand是全局变量,所以可以将brand作为返回值 
      return brand;
    },
    // 当设置属性的值的时候,会访问set方法,设置的值,就是该函数的实参
    set: function(value){
      //定义一个全局变量,
      brand=value;
      //将设置的结果返回给对象的属性,然后通过get请求获取  
      return brand;
    }
})
aoma.brand = "奥玛";
console.log(aoma.brand)

课堂练习

  1. 求出一个字符串里出现次数最多的字符. 提示 用字符作为key值,出现的次数作为value值.

results matching ""

    No results matching ""