JS 入门之对象


JS 入门章节目录


第四章:对象

文章の目录

对象

对象是包含变量的变量

对象属性

对象方法

创建 JavaScript 对象

使用对象字面量

使用 JavaScript 关键词 new

JavaScript 对象是易变的

JavaScript 对象属性

JavaScript 对象属性

访问对象属性

for...in 循环

添加新属性

删除属性

属性值

原型属性

JavaScript 对象方法

JavaScript 对象方法

this 关键词

访问对象方法

JavaScript 显示对象

如何显示 JavaScript 对象?

按名称显示对象属性

在循环中显示对象

使用 Object.values()

使用 JSON.stringify()

对象构造器

对象类型(蓝图)

语法

this 关键词

为构造器添加属性和方法

内建 JavaScript 构造器

对象访问器

JavaScript 对象访问器(Getter 和 Setter)

JavaScript Getter(get 关键词)

JavaScript Setter(set 关键词)

为什么使用 Getter 和 Setter?

原型和原型链

Date 对象

Date 对象

Date 对象方法

getFullYear()

getMonth()

getDate()

getDay()

getHours()

getMinutes()

getSeconds()

toLocaleString()

toLocaleDateString()

toLocaleTimeString()

Math 对象

Math 对象

Math 对象属性

Math 对象方法


正文

在 JavaScript 中,对象是王。如果您理解了对象,就理解了 JavaScript。

在 JavaScript 中,几乎“所有事物”都是对象。

  • 布尔是对象(如果用 new 关键词定义)
  • 数字是对象(如果用 new 关键词定义)
  • 字符串是对象(如果用 new 关键词定义)
  • 日期永远都是对象
  • 算术永远都是对象
  • 正则表达式永远都是对象
  • 数组永远都是对象
  • 函数永远都是对象
  • 对象永远都是对象

所有 JavaScript 值,除了原始值,都是对象。

注:

JavaScript 原始值:

  • 原始值指的是没有属性或方法的值。
  • 原始数据类型指的是拥有原始值的数据。

JavaScript 定义了 5 种原始数据类型:

  • string
  • number
  • boolean
  • null
  • undefined

原始值是一成不变的(它们是硬编码的,因此不能改变)。

假设 x = 3.14,您能够改变 x 的值。但是您无法改变 3.14 的值。

对象

对象是包含变量的变量

对象也是变量。但是对象能够包含很多值。

  • 值按照 名称:值 对的形式编写(名称和值以冒号分隔)。
  • 每个 名称:值 对之间以逗号(,)分隔。
  • 请不要在最后一个 名称:值 对之后写逗号。

JavaScript 对象是命名值的集合。

JavaScript 对象是被称为属性和方法的命名值的容器。

对象属性

JavaScript 对象中的命名值,被称为属性。

对象方法

方法是可以在对象上执行的动作。

对象属性可以是原始值、其他对象以及函数。

对象方法是包含函数定义的对象属性。

创建 JavaScript 对象

通过 JavaScript,您能够定义和创建自己的对象。

有不同的方法来创建对象:

  • 定义和创建单个对象,使用对象文字
  • 定义和创建单个对象,通过关键词 new
  • 定义对象构造器,然后创建构造类型的对象

使用对象字面量

这是创建对象最简单的方法。

使用对象文字,您可以在一条语句中定义和创建对象。

对象文字指的是花括号 {} 中的 名称:值 对(比如 age:18)。

注:

  • 空格和折行不重要。对象定义可横跨多行。

例:

var person = {
    firstName: "Bill",
    lastName: "Gates",
    age: 67,
    fullName: function(){
        return this.firstName + " " + this.lastName;
    }
};

使用 JavaScript 关键词 new

例:

var person = new Object();
person.firstName = "Bill";
person.lastName = "Gates";
person.age = 67;
person.fullName = function(){
    return this.firstName + " " + this.lastName;
};

使用对象文字和通过关键词 new 结果是一样的。无需使用 new Object()。

出于简易性、可读性和执行速度的考虑,请使用对象文字方法。

JavaScript 对象是易变的

对象是易变的:它们通过引用来寻址,而非值。

如果 person 是一个对象,下面的语句不会创建 person 的副本:

var x = person;    // 这不会创建 person 的副本。

对象 x 并非 person 的副本。它就是 person。x 和 person 是同一个对象。

对 x 的任何改变都将改变 person,因为 x 和 person 是同一个对象。

注:

  • JavaScript 变量不是易变的。只有 JavaScript 对象如此。

JavaScript 对象属性

属性是任何 JavaScript 对象最重要的部分。

JavaScript 对象属性

属性指的是与 JavaScript 对象相关的值。

JavaScript 对象是无序属性的集合。

属性通常可以被修改、添加和删除,但是某些属性是只读的。

访问对象属性

访问对象属性的语法是:

objectName.property    // person.name

// 或者

objectName["property"]    // person["name"]

// 或者

objectName[expression]    // x = "name"; person[x]
// 表达式必须计算为属性名。

for...in 循环

JavaScript for...in 语句遍历对象的属性。

语法:

for(var key in obj){
    // 要执行的代码
}

// key —— 属性名
// obj[key] —— 属性值
// 您必须在循环中使用 obj[key]
// obj.key 将不起作用(因为 key 是一个变量)

for...in 循环中的代码块会为每个属性执行一次。

添加新属性

您可以通过简单的赋值,向已存在的对象添加新属性。

假设 person 对象已存在,那么您可以为其添加新属性:

person.name = "Bill Gates";

您不能使用预留词作为属性名(或方法名)。请使用 JavaScript 命名规则。

删除属性

delete 关键词从对象中删除属性。

语法:

delete objectName.property

// 或

delete objectName["property"]

delete 关键词会同时删除属性的值和属性本身。

删除完成后,属性在被添加回来之前是无法使用的。

delete 操作符被设计用于对象属性。它对变量或函数没有影响。

delete 操作符不应被用于预定义的 JavaScript 对象属性。这样做会使应用程序崩溃。

属性值

所有属性都有名称。此外它们还有值。

值是属性的特性之一。

其他特性包括:可列举、可配置、可写。

这些特性定义了属性被访问的方式(是可读的还是可写的?)。

在 JavaScript 中,所有属性都是可读的,但是只有值是可修改的(只有当属性为可写时)。

原型属性

JavaScript 对象继承了它们的原型的属性。

delete 关键词不会删除被继承的属性,但是如果删除了某个原型属性,则将影响到所有从原型继承的对象。

JavaScript 对象方法

JavaScript 对象方法

JavaScript 对象方法是能够在对象上执行的动作。

JavaScript 方法是包含函数定义的属性。

方法是存储为对象属性的函数。

this 关键词

在 JavaScript 中,被称为 this 的事物,指的是拥有该 JavaScript 代码的对象。

this 的值,在函数中使用时,是“拥有”该函数的对象。

请注意 this 并非变量。它是关键词。您无法改变 this 的值。

this 拥有不同的值,具体取决于它的使用位置:

  • 方法中的 this:在对象方法中,this 指的是此方法的“拥有者”(拥有此方法的对象)

访问对象方法

请使用如下语法创建对象方法:

methodName: function(){ 代码 }

请通过如下语法来访问对象方法:

objectName.methodName()

通常会把 methodName() 描述为对象的方法,把 propertyName 描述为属性(区分:带不带括号)。

methodName 属性在被通过 () 调用后会以函数形式执行。

如果访问 methodName 属性时没有使用 (),则将返回函数定义。

JavaScript 显示对象

如何显示 JavaScript 对象?

在页面中显示 JavaScript 对象将输出 [object Object]。

显示 JavaScript 对象的一些常见解决方案是:

  • 按名称显示对象属性
  • 循环显示对象属性
  • 使用 Object.values() 显示对象
  • 使用 JSON.stringify() 显示对象

按名称显示对象属性

obj.propertyName

在循环中显示对象

可以使用 for...in 语句在循环中收集对象的属性

for(var x in obj){
    // x 为属性名
    // obj[x] 为属性值
}

// 必须在循环中使用 obj[x]
// obj.x 将不起作用(因为 x 是一个变量)

使用 Object.values()

通过使用 Object.values(),任何 JavaScript 对象都可以被转换为数组。

Object.values() 返回一个包含对象自身的所有可枚举属性值的数组。

语法:

Object.values(obj);

自 2016 年以来,所有主要浏览器都支持 Object.values()。

使用 JSON.stringify()

任何 JavaScript 对象都可以使用 JavaScript 函数 JSON.stringify() 进行字符串化(转换为字符串)。

结果将是一个遵循 JSON 标记法的字符串。

JSON.stringify() 包含在 JavaScript 中,所有主流浏览器都支持。

JSON.stringify() 不会对函数进行字符串化。

语法:

JSON.stringify(obj);

对象构造器

对象类型(蓝图)

在之前的学习中,我们已经掌握怎么创建单一对象。

但是有时候我们需要创建相同“类型”的许多对象的“蓝图”。

创建一种“对象类型”的方法,是使用对象构造器函数。

通过 new 关键词调用构造器函数可以创建相同类型的对象。

语法

// 函数 Person() 就是对象构造器函数。
function Person(first, last, age) {
    this.firstName = first;
    this.lastName = last;
    this.age = age;
    this.nationality = "English";    // 对象属性可以拥有默认值
    this.name = function() {
        return this.firstName + " " + this.lastName;
    };
}

// 通过 new 关键词调用构造器函数创建相同类型的对象
var myFather = new Person("Bill", "Gates", 62);
var myMother = new Person("Steve", "Jobs", 56);

注:

  • 用大写首字母对构造器函数命名是个好习惯。

this 关键词

在构造器函数中,this 是没有值的。它是新对象的替代物。当一个新对象被创建时,this 的值会成为这个新对象。

为构造器添加属性和方法

为已有的对象添加新属性和新方法很简单。

与向已有对象添加新属性和新方法不同,我们无法为对象构造器添加新属性和新方法。

如需向构造器添加一个新属性或新方法,我们必须添加到构造器函数。

// 为对象添加属性
myFather.height = 175;
// 为对象添加方法
myFather.eat = function () {
    console.log("今天吃了很多。");
};
// 新属性和新方法被添加到 myFather。不是 myMother,也不是任何其他 person 对象。

// 为构造器添加属性和方法
// 错误的做法
// Person.height = 180;
// Person.eat = function () {
//     console.log("今天吃了很多。");
// };

// 正确的做法
function Person(first, last, age, height) {
    this.firstName = first;
    this.lastName = last;
    this.age = age;
    this.height = height;
    this.nationality = "English";    // 对象属性可以拥有默认值
    this.name = function() {
        return this.firstName + " " + this.lastName;
    };
    this.eat = function () {
        console.log("今天吃了很多。");
    };
}

内建 JavaScript 构造器

JavaScript 提供用于原始对象的构造器:

var x1 = new Number();     // 一个新的 Number 对象
var x2 = new String();     // 一个新的 String 对象
var x3 = new Boolean();    // 一个新的 Boolean 对象
var x4 = new Object();     // 一个新的 Object 对象
var x5 = new Array();      // 一个新的 Array 对象
var x6 = new Function();   // 一个新的 Function 对象
var x7 = new RegExp();     // 一个新的 GrgExp 对象
var x8 = new Date();       // 一个新的 Date 对象

// Math() 对象不在此列。Math 是全局对象。new 关键词不可用于 Math。

如上所见,JavaScript 提供原始数据类型数字、字符串和布尔的对象版本。但是并无理由创建复杂的对象,原始值快得多:

  • 请使用数值字面量代替 new Number()。
  • 请使用字符串字面量 "" 代替 new String()。
  • 请使用布尔字面量代替 new Boolean()。
  • 请使用对象字面量 {} 代替 new Object()。
  • 请使用数组字面量 [] 代替 new Array()。
  • 请使用函数表达式 (){} 代替 new Function()。
  • 请使用模式字面量代替 new RexExp()。

实例:

var x1 = 0;                // 新的原始数值
var x2 = " ";              // 新的原始字符串
var x3 = true;             // 新的原始逻辑值
var x4 = {};               // 新对象
var x5 = [];               // 新的数组对象
var x6 = function() {}     // 新的函数对象
var x7 = /()/              // 新的正则表达式对象 

对象访问器

JavaScript 对象访问器(Getter 和 Setter)

ECMAScript 5(2009)引入了 Getter 和 Setter。

Getter 和 Setter 允许定义对象访问器(被计算的属性)。

JavaScript Getter(get 关键词)

语法

var student = {
    name: "zhangsan",
    age: 18,
    get getName() {
        return this.name;
    }
};

console.log(student.getName);

JavaScript Setter(set 关键词)

语法

var student = {
    name: "zhangsan",
    age: 18,
    get getName() {
        return this.name;
    },
    set setName(name) {
        this.name = name;
    }
};

student.setName = "lisi";

console.log(student.getName);

为什么使用 Getter 和 Setter?

  • 它提供了更简洁的语法
  • 它允许属性和方法的语法相同
  • 它可以确保更好的数据质量
  • 有利于后台工作

例:

// JavaScript 函数还是 Getter ?

// 例子 1
var student = {
    name: "zhangsan",
    getName: function() {
        return this.name;
    }
};

// 例子 2
var student = {
    name: "zhangsan",
    get getName(){
        return this.name;
    }
};

// 例子 1 以函数形式访问 getName:student.getName()
// 例子 2 以属性形式访问 getName:student.getName
// 第二个例子提供了更简洁的语法
// 使用 getter 和 setter 时,JavaScript 可以确保更好的数据质量。

// 使用 getName 属性以大写形式返回 name 属性的值
var student = {
    name: "zhangsan",
    get getName() {
        return this.name.toUpperCase();
    }
};

// 使用 setName 属性将大写值存储在 name 属性中
var student = {
    name: "zhangsan",
    set setName(name) {
        this.name = name.toUpperCase();
    }
};

原型和原型链

(如需了解原型和原型链相关内容,请阅读笔者另一篇文章:原型和原型链

Date 对象

Date 对象

Date 对象用于处理日期与时间。

创建 Date 对象:new Date()

var date = new Date();    // Tue Mar 07 2023 15:47:06 GMT+0800 (中国标准时间)

Date 对象方法

getFullYear()

从 Date 对象以四位数字返回年份。

var year = new Date().getFullYear();    // 2023
// 获取当前完整的年份

getMonth()

从 Date 对象返回月份(0 ~ 11)。

var month = new Date().getMonth();    // 2
// 获取当前月份(0-11,0代表1月)

getDate()

从 Date 对象返回一个月中的某一天(1 ~ 31)。

var date = new Date().getDate();    // 7
// 获取当前日(1-31)

getDay()

从 Date 对象返回一周中的某一天(0 ~ 6)

var day = new Date().getDay();    // 2
// 获取当前星期几(0-6,0代表星期日)

getHours()

返回 Date 对象的小时(0 ~ 23)。

var hours = new Date().getHours();    // 15
// 获取当前小时数(0-23)

getMinutes()

返回 Date 对象的分钟(0 ~ 59)。

var minutes = new Date().getMinutes();    // 47
// 获取当前分钟数(0-59)

getSeconds()

返回 Date 对象的秒数(0 ~ 59)。

var seconds = new Date().getSeconds();    // 6
// 获取当前秒数(0-59)

toLocaleString()

根据本地时间格式,把 Date 对象转换为字符串。

toLocaleDateString()

根据本地时间格式,把 Date 对象的日期部分转换为字符串。

toLocaleTimeString()

根据本地时间格式,把 Date 对象的时间部分转换为字符串。

Math 对象

Math 对象

Math 对象用于执行数学任务。

Math 对象并不像 Date 那样是对象的类,因此没有构造函数 Math()。

Math 对象属性

  • PI —— 返回圆周率(约等于3.14159)。

Math 对象方法

  • abs(x) —— 返回 x 的绝对值
  • pow(x,y) —— 返回 x 的 y 次幂
  • sqrt(x) —— 返回 x 的平方根
  • round(x) —— 四舍五入
  • ceil(x) —— 对 x 进行上舍入(向上取整)
  • floor(x) —— 对 x 进行下舍入(向下取整)
  • random() —— 返回 0(包含) ~ 1(不包含) 之间的随机数( [0,1) )
  • max(x,y,z,...,n) —— 返回 x,y,z,...,n 中的最高值
  • min(x,y,z,...,n) —— 返回 x,y,z,...,n 中的最低值

例:

// 求 [1,10] 之间的随机整数
var x = Math.floor(Math.random() * 10) + 1;
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值