首页 > 其他分享 >6. 对象

6. 对象

时间:2022-12-09 21:01:58浏览次数:27  
标签:console name 对象 obj 属性 构造函数

创建自定义对象的几种方法

方式一:对象字面量

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

  • 键:相当于属性名。

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

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

var obj = {};

使用对象字面量,可以在创建对象时,直接指定对象中的属性。语法:{属性名:属性值,属性名:属性值....}

例 1:(一个简单的对象)

const obj1 = {
    name: '千',
    age: 28
};

例 2:(一个较复杂的对象)

const obj2 = {
    name: "千",
    age: 26,
    isBoy: true,
    // 还可以存放一个嵌套的对象
    test: {
        id: 123,
        tel: 180
    }
    //我们还可以在对象中增加一个方法。以后可以通过obj2.sayName()的方式调用这个方法
    sayName: function() {
        console.log(this.name);
    }
};

console.log(JSON.stringify(obj2));
obj2.sayName();

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

属性名和属性值是一组一组的键值对结构,键和值之间使用:连接,多个值对之间使用,隔开。

方式:利用构造函数

//利用构造函数自定义对象
var stu1 = new Student('smyh');
console.log(stu1);
stu1.sayHi();

var stu2 = new Student('vae');
console.log(stu2);
stu2.sayHi();

// 创建一个构造函数
function Student(name) {
    this.name = name; //this指的是当前对象实例【重要】
    this.sayHi = function () {
        console.log(this.name + '厉害了');
    };
}

打印结果:

构造函数

代码引入

// 创建一个构造函数,专门用来创建Person对象
function Person(name, age, gender) {
    this.name = name;
    this.age = age;
    this.gender = gender;
    this.sayName = function () {
        alert(this.name);
    };
}

var per = new Person('孙悟空', 18, '男');
var per2 = new Person('玉兔精', 16, '女');
var per3 = new Person('奔波霸', 38, '男');

// 创建一个构造函数,专门用来创建 Dog 对象
function Dog() {}

var dog = new Dog();

构造函数的概念

构造函数:是一种特殊的函数,主要用来创建和初始化对象,也就是为对象的成员变量赋初始值。它与 new 一起使用才有意义。

我们可以把对象中一些公共的属性和方法抽取出来,然后封装到这个构造函数里面。

构造函数和普通函数的区别

构造函数的创建方式和普通函数没有区别,不同的是构造函数习惯上首字母大写。

构造函数和普通函数的区别就是调用方式的不同:普通函数是直接调用,而构造函数需要使用 new 关键字来调用。

this 的指向也有所不同

  • 1.以函数的形式调用时,this 永远都是 window。比如fun();相当于window.fun();

  • 2.以方法的形式调用时,this 是调用方法的那个对象

  • 3.以构造函数的形式调用时,this 是新创建的实例对象

new 一个构造函数的执行流程

new 在执行时,会做下面这四件事:

(1)开辟内存空间,在内存中创建一个新的空对象。

(2)让 this 指向这个新的对象。

(3)执行构造函数里面的代码,给这个新对象添加属性和方法。

(4)返回这个新对象(所以构造函数里面不需要 return)。

因为 this 指的是 new 一个 Object 之后的对象实例。于是,下面这段代码:

// 创建一个函数
function createStudent(name) {
    var student = new Object();
    student.name = name; //第一个name指的是student对象定义的变量。第二个name指的是createStudent函数的参数。二者不一样
}

可以改进为:

// 创建一个函数
function Student(name) {
    this.name = name; //this指的是构造函数中的对象实例
}

注意上方代码中的注释。

静态成员和实例成员

JavaScript 的构造函数中可以添加一些成员,可以在构造函数本身上添加,也可以在构造函数内部的 this 上添加。通过这两种方式添加的成员,就分别称为静态成员和实例成员。

  • 静态成员:在构造函数本上添加的成员称为静态成员,只能由构造函数本身来访问。

  • 实例成员:在构造函数内部创建的对象成员称为实例成员,只能由实例化的对象来访问。

类、实例

使用同一个构造函数创建的对象,我们称为一类对象,也将一个构造函数称为一个

通过一个构造函数创建的对象,称为该类的实例

instanceof

使用 instanceof 可以检查一个对象是否为一个类的实例

语法如下

对象 instanceof 构造函数;

如果是,则返回 true;否则返回 false。

对象的基本操作

创建对象

使用 new 关键字调用的函数,是构造函数 constructor。构造函数是专门用来创建对象的函数

例如:

const obj = new Object();

记住,使用typeof检查一个对象时,会返回object

关于创建对象的更多方式,可以看上一篇文章《对象的创建&构造函数》。

向对象中添加属性

在对象中保存的值称为属性。

向对象添加属性的语法:

对象.属性名 = 属性值;

举例:

const obj = new Object();

//向obj中添加一个name属性
obj.name = '孙悟空';

//向obj中添加一个gender属性
obj.gender = '男';

//向obj中添加一个age属性
obj.age = 18;

console.log(JSON.stringify(obj)); // 将 obj 以字符串的形式打印出来

打印结果:

	{
		"name":"孙悟空",
		"gender":"男",
		"age":18
	}

这里我们也可以看出一个规律:如果对象里本身没有某个属性,则用点语法赋值时,这个属性会被创建出来。

获取对象中的属性

方式 1

语法:

对象.属性名;

如果获取对象中没有的属性,不会报错而是返回undefined

举例:

const obj = new Object();

//向obj中添加一个name属性
obj.name = '孙悟空';

//向obj中添加一个gender属性
obj.gender = '男';

//向obj中添加一个age属性
obj.age = 18;

// 获取对象中的属性,并打印出来
console.log(obj.gender); // 打印结果:男
console.log(obj.color); // 打印结果:undefined

方式 2:可以使用[]这种形式去操作属性

如果属性名的命名规范没有遵循标识符的命名规范,就不能采用.的方式来操作对象的属性,则必须用方括号的形式来访问。比如说,123这种属性名,如果我们直接写成obj.123 = 789来操作属性,是会报错的。那怎么办呢?办法如下:

语法格式如下:(读取时,也是采用这种方式)

// 注意,括号里的属性名,必须要加引号

// 获取属性
对象['属性名']

// 设置属性值
对象['属性名'] = 属性值;

上面这种语法格式,举例如下:

obj['123'] = 789;

当然,如果属性名遵循了标识符的命名规范,也可以使用方括号操作属性。

重要:使用[]这种形式去操作属性会更灵活,因为我们可以在[]中传递一个变量。也就是说,如果属性名以变量的形式存储,请记得也必须使用方括号的形式操作属性。这在日常开发中,使用得非常多。比如:

const person = {
		name: '千古壹号',
    age: 30
}

const myKey = 'name';
// 错误的访问方式
console.log(obj.myKey); // undefined
// 正确的访问方式
console.log(obj[myKey]); // 千古壹号

修改对象的属性值

语法:

对象.属性名 = 新值;

举例:

obj.name = 'qiangu yihao';

删除对象的属性

语法:

delete obj.name;

in 运算符

通过该运算符可以检查一个对象中是否含有指定的属性。如果有则返回 true,没有则返回 false。

语法:

'属性名' in 对象;

举例:

//检查对象 obj 中是否含有name属性
console.log('name' in obj);

我们平时使用的对象不一定是自己创建的,可能是从接口获取的,这个时候,in 运算符可以派上用场。

当然,还有一种写法可以达到上述目的:

if (obj.name) {
    // 如果对象 obj 中有name属性,我就继续做某某事情。
}

for of:遍历数组

ES6 中,如果我们要遍历一个数组,可以这样做:

let arr1 = [2, 6, 8, 5];

for (let value of arr1) {
    console.log(value);
}

打印结果:

2
6
8
5

for ... of 的循环可以避免我们开拓内存空间,增加代码运行效率,所以建议大家在以后的工作中使用 for…of 遍历数组。

注意,上面的数组中,for ... of获取的是数组里的值;如果采用for ... in遍历数组,则获取的是 index 索引值。

Map 对象的遍历

for ... of既可以遍历数组,也可以遍历 Map 对象。

for in:遍历对象的属性

for ... in主要用于遍历对象,不建议用来遍历数组。

语法:

for (const 变量 in 对象) {

}

解释:对象中有几个属性,循环体就会执行几次。每次执行时,会将对象中的每个属性的 属性名 赋值给变量

语法举例:

for (var key in obj) {
    console.log(key); // 这里的 key 是:对象属性的键(也就是属性名)
    console.log(obj[key]); // 这里的 obj[key] 是:对象属性的值(也就是属性值)
}

举例:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8" />
        <title></title>
        <script type="text/javascript">
            const obj = {
                name: 'qianguyihao',
                age: 28,
                gender: '男',
                address: 'shenzhen',
                sayHi: function () {
                    console.log(this.name);
                },
            };

            // 遍历对象中的属性
            for (const key in obj) {
                console.log('属性名:' + key);
                console.log('属性值:' + obj[key]); // 注意,因为这里的属性名 key 是变量,所以,如果想获取属性值,不能写成 obj.key,而是要写成 obj[key]
            }
        </script>
    </head>

    <body></body>
</html>

打印结果:

属性名:name
属性值:qianguyihao

属性名:age
属性值:26

属性名:gender
属性值:男

属性名:address
属性值:shenzhen

属性名:sayHi
属性值:function() {
                    console.log(this.name);
                }

for in 遍历数组(不建议)

另外,for in 当然也可以用来遍历数组(只是不建议),此时的 key 是数组的索引。举例如下:

const arr = ['hello1', 'hello2', 'hello3'];

for (const key in arr) {
    console.log('属性名:' + key);
    console.log('属性值:' + arr[key]);
}

打印结果:

属性名:0
属性值:hello1

属性名:1
属性值:hello2

属性名:2
属性值:hello3

标签:console,name,对象,obj,属性,构造函数
From: https://www.cnblogs.com/qianfanqf/p/16969904.html

相关文章