万物皆可盘,万物皆对象。
JavaScript 中的所有事物都是对象:字符串、数字、数组、日期,等等。
在 JavaScript 中,对象是拥有属性和方法的数据。
属性:是和对象相关的值。
方法:能够在对象上执行的动作。
学习目标
- 如何创建并使用对象?
- 什么是构造器函数?
- js中的内置对象及其运用?
如何创建并使用对象?
// 1.对象字面量创建对象
var pig = {
age: 1,
weight: '55kg'
}
// 2.通过new运算符创建对象
var obj = new Object(); // new运算符后面跟的是一个函数调用,这个函数被称为构造函数。js中原始类型都包含内置的构造函数,也可以自己定义构造函数。
function Person(name, age){ // 自己定义构造函数。
this.name = name;
this.age = age;
}
var obj1 = new Person("ys", 12);
// 3.通过立即执行函数创建对象
var obj = (function(){ return {x:1,y:2};}()); // 在立即执行函数内部一定要有return语句,return出的内容就是待创建的对象。
// 4.Object.create()创建
var obj1 = Object.create({
name: "ys",
age: 12
});
// pig 变量为保存该对象
// 对象使用的是大括号{}
// 括号中用逗号分隔着的是组成该对象的元素,熟称属性
// 键值对之间用冒号分隔,例如: key:value
// 一般情况下属性名不加引号,但是在属性名是保留字、属性名包含空格或者其他特殊字符(下划线、数字、下划线以外的字符),属性名以数字开头
访问对象属性
通常两种方式访问对象的属性:
- 中括号表示法,pig['age'], 当访问的属性名不确定时,就必须用中括号表示法。
- 点号表示法,pig.age
调用对象的方法
对象方法实际是上,只是 一个函数类型属性,因此访问方式和属性完成相同。即用点号表示法或者中括号表示法均可。
修改属性和方法
js是一种动态语言,允许随时对现存对象的属性和方法进行修改,其中包括添加和删除属性。
var hero = {};
typeof hero.age // undefined
hero.age = 2;
hero.weight = "55kg";
hero.sayAge = function(){
return hero.age; // 这里可以使用 this.age ,当我们引用this值时,实际所引用的就是这个对象或者当前对象。
}
hero.sayAge(); // 2
delete hero.age; // ture
hero.sayAge(); // undefined
什么是构造器函数?
用new关键字来调用的函数,首字母一般大写;
用this来构造它的属性以及方法;
写普通函数时一般习惯用驼峰命名,而构造函数一般首字母大写(约定俗成)以及构造函数是用来新建实例对象。
constructor function 构造器函数的方式来创建对象。
当我们声明了一个构造函数,但又不通过new 来调用它时,代码就会返回 undefined。
function Hero(){
this.name = "超级英雄";
}
var hero = new Hero(); // 使用new操作符创建对象
hero.name // "超级英雄"
// 使用构造器函数的好处在于,可以在创建对象时接收一些参数。
function Hero(name){
this.name = name;
this.occupation = "医生";
this.whoAreYou = function(){
return `我的名字是 ${this.name},我的职业是一名${this.occupation}。 `
}
}
var h1 = new Hero('zhansan');
var h2= new Hero('lisi');
typeof h1 // object
var h = Hero('wangwu'); // 不使用new 操作符
typeof h // undefined 因为没有使用new操作符,因此不是创建一个新的对象,相当于普通函数的调用,这里h值就是该函数的返回值,而函数的默认返回值就是undefined.
// 这种情况下 this 的引用就是全局对象,当程序的宿主环境是web浏览器时,它提供的全局对象就是window。
构造器属性
当通过构造器 函数创建对象时,实际上同时也赋予了该对象一种特俗的属性,即构造器属性 construction property。该属性指向用于创建该对象的构造器函数的引用。
function Hero(name){
this.name = name;
this.occupation = "医生";
this.whoAreYou = function(){
return `我的名字是 ${this.name},我的职业是一名${this.occupation}。 `
}
}
var h1 = new Hero('zhansan');
h1.constructor
var o = {};
o.constructor // ƒ Object() { [native code] }
typeof o.constructor // function
通过 instanceof 操作符可以测试一个对象是不是由某个指定的构造器函数创建的。
function Hero(name){
this.name = name;
this.occupation = "医生";
this.whoAreYou = function(){
return `我的名字是 ${this.name},我的职业是一名${this.occupation}。 `
}
}
var h1 = new Hero('zhansan');
h1 instanceof Hero // true
对象的比较
当且仅当两个引用指向同一个对象时为 true.
如果是不同的对象,即使他们拥有相同的属性和方法,比较操作也会返回false.
var pig = {age:2};
var cat = {age:2};
pig == cat // false
pig === cat // false
// 新建一个变量 cat2 ,并将其中一个对象赋值给它。这样 cat2实际上就指向了这个变量
var cat2 = pig;
cat2 == pig // true
cat2 === pig // true
cat2 == cat // false
cat2 === cat // false
内建对象
内建对象大致上可以分为三个组
- 数据封装类对象
- Obejct、Array、Boolean、Number、String
- 工具类对象
- Math、Date、RegExp
- 错误类对象
无论是函数还是构造器函数,最后都是对象。