JavaScript中的Object对象

36 阅读3分钟

Object 对象

JavaScript所有的事物都是可以称为对象,例如String、Number、Array、Function...

一、js如何创建对象

1.工厂模式 new Object()

通过该方法可以大批量的创建对象。

/*
 * 使用工厂方法创建对象
 *  通过该方法可以大批量的创建对象
 */
function createPerson(name, age, gender) {
    //创建一个新的对象
    const obj = new Object();
    //向对象中添加属性
    obj.name = name;
    obj.age = age;
    obj.gender = gender;
    obj.sayName = function () {
        alert(this.name);
    };
    //将新的对象返回
    return obj;
}

const obj2 = createPerson('猪八戒', 28, '男');
const obj3 = createPerson('白骨精', 16, '女');
const obj4 = createPerson('蜘蛛精', 18, '女');

第一次看到这种工厂模式时,你可能会觉得陌生。如果简化一下,可以写成下面这种形式,更容易理解:(也就是,利用 new Object 创建对象)

const obj = new Obect();
obj.name = '猪八戒';
obj.age = 28;
obj.gender = '男';
obj.sayHi = function () {
    alert('hello world');
};

弊端: 使用工厂方法创建的对象,使用的构造函数都是 Object。所以创建的对象都是 Object 这个类型,就导致我们无法区分出多种不同类型的对象

2.对象字面量

对象的字面量就是一个{}。里面的属性和方法均是键值对

  • 键:相当于属性名。
  • 值:相当于属性值,可以是任意类型的值(数字类型、字符串类型、布尔类型,函数类型等)。

使用对象字面量来创建一个对象,非常简洁,举例如下::

let obj2 = {}

对象字面量的属性名可以加引号也可以不加,建议不加。如果要使用一些特殊的名字,则必须加引号。

对象字面量和 json 比较像

JSON:JavaScript Object Notation(JavaScript 对象表示形式)。 JSON 和对象字面量的区别:JSON 的属性必须用双引号引号引起来,对象字面量可以省略。

json 举例:

      {
            "name" : "zs",
            "age" : 18,
            "sex" : true,
            "sayHi" : function() {
                console.log(this.name);
            }
        };

注:json 里一般放常量、数组、对象等,但很少放 function。

另外,对象和 json 没有长度,json.length 的打印结果是 undefined。于是乎,自然也就不能用 for 循环遍历(因为遍历时需要获取长度 length)。

json 遍历的方法:

json 采用 for...in...进行遍历,和数组的遍历方式不同。如下:

<script>
    const myJson = {
        name: 'smyhvae',
        aaa: 111,
        bbb: 222,
    };

    //json遍历的方法:for...in...
    for (const key in myJson) {
        console.log(key); //获取 键
        console.log(myJson[key]); //获取 值(第二种属性绑定和获取值的方法)
        console.log('------');
    }
</script>

3.构造函数创建对象的方式

(1)

obj1['fn'] = function fn1(a, b) {
  console.log('我是fn1的函数')
}
console.log(obj1)

(2)

function f(name, age) {
 this.name = name
 this.age = age
}
const son = new f('张三', 20)
const son2 = new f('王五', 20)
console.log(son)
console.log(son2)

4.Object.create(原型)返回一个新对象

function Person() {}
Person.prototype.lasteName = 'xu'

相当于obj2借用了Person()的原型,复制了一份,让他成为自己的原型

const obj4 = Object.create(Person.prototype)
console.log(obj4)

二.设置对象的属性

1.通过点的形式

obj1.name = 'hy'
obj1.id = 1
console.log(obj1)

2.中括号的方式

obj2['name'] = '小明'
obj2['id'] = 2
console.log(obj2)

区别

比如键名为数字

obj1['0'] = '1'
obj1['0'] = '2'
console.log(obj1)

键名是独一无二的,如果出现一样的键名,那么后则余覆盖前者


obj1."1" = "1";//报错
obj1.1 = "1";//报错

相对来说 []使用更广泛

三、获取对象属性

console.log(obj1.name, obj1.id) . 方式
console.log(obj1['name'], obj1['id']) []方式

获取不存在的属性时

console.log(obj1.aaa) ///undefined
console.log(obj1['aaa']) ///undefined

三、修改对象的属性值

先获取对象属性,再重新赋值

obj1['name'] = 'xiaohong'
console.log(obj1['name'])

修改obj1的fn中函数体 修改前

console.log(obj1['fn'])
obj1['fn']() //我是fn1的函数

修改后

obj1['fn'] = function fn1(a, b) {
  console.log('我是修改后的fn1的函数')
}
console.log(obj1['fn'])
obj1['fn']() //我是fn1的函数

console.log(obj1)

四.删除对象的属性

delete 关键词

delete 属性名


console.log(obj1.name) //xiaohong
delete obj1.name
console.log(obj1.name) //undefined