理解对象
何为对象?(Object)
ECMA-262把对象定义为:“无序属性的集合,其属性可以包含基本值、对象或者函数。”
严格来讲,对象是一组没有特定顺序的值。对象的每个属性或方法都有一个名字,而每个名字都映射到一个值,可以把ECMAScript
的对象想象成散列表:无非就是一组名值对,其中值可以是数据或函数(来源:JavaScript 高级程序设计 第3版)
最简单的方式,创建一个Object的实例,然后再为它添加属性和方法,如下:
1 | var person = new Object(); // new了一个`Object`的实例对象并保存名为`person`的变量中 |
创建对象
一般情况下,JS中创建对象的方式可以用构造函数
Object
或者对象字面量的方式,但需要创建几个具有相同属性或方法的对象时,就得写大量的冗余代码。故而出现了下述几种创建对象的方法。
使用对象字面量创建对象
对象字面量是对象定义的一种简写方式,目的在于简化创建包含大量属性的对象的过程
1 | var person = { |
在使用对象字面量语法时,属性名也可以使用字符串,例子如下:
1 | var person = { |
另外,使用对象字面量语法时,如果留空其花括号,则可以定义只包含默认属性和方法的对象,例子如下:
1 | var person = {}; // 与 new Object() 相同 |
对象字面量的语法,推荐只在考虑对象名的可读性时使用。
对象字面量创建方式也是向函数传递大量可选参数的首选方式,例如:
1 | function displayInfo(args) { |
通过new
操作符创建对象
使用new
操作符创建并初始化一个新对象,关键字new
后跟随一个Object
构造函数,例子如下:
1 | var person = new Object(); // 创建一个空对象并保存在变量person中,和{}一样 |
JavaScript语言核心中的原始类型都包含内置构造函数,例如:
1 | var o = new Object(); // 创建一个空对象,和 {} 一样 |
工厂模式(Factory pattern)
工厂模式是软件工程使用同一个接口创建很多对象,会产生大量的重复代码。为了解决这个问题,开始使用工厂模式的一种变体。
这种模式抽象了创建具体对象的过程。考虑到在ECMAScript中无法创建类,用函数来封装以特定接口创建对象的细节,这个就被称工厂模式(Factory Pattern)
原理:通过将对象的创建封装到一个方法中,可以无数次调用这个函数
1 | function createPerson (name, age, gender, job) { |
构造函数(Constructor)模式
关键字new后跟随一个函数调用,这里的函数称作构造函数(
Constructor
)
ECMAScript 中的构造函数可用来创建特定类型的对象,像Object
和Array
这样的原生构造函数,在运行时会自动出现在执行环境中,也可以创建自定义的构造函数,从而定义自定义对象类型的属性和方法
1 | function Person (name, age, job) { |
对比工厂模式,可以发现以下区别:
1、没有显示地创建对象
2、直接将属性和方法赋给了this
对象;
3、没有return
语句
4、创建对象时需要使用new
关键字
PS:按照惯例,构造函数始终都应该以一个大写字母开头,而非构造函数则应该以一个小写字母开头。(借鉴其他OO语言,为了区别其他ECMAScript中的其他函数)因为构造函数本身也是函数,只不过可以用来创建对象而已。
要创建Person
的新实例,必须使用new
操作符。
构造函数执行的几个步骤:
(1)、创建一个新对象
(2)、将构造函数的作用域赋给新对象(因此this
就指向了这个新对象)
(3)、执行构造函数中的代码(为这个新对象添加属性)
(4)、放回新对象
构造函数和普通函数的区别?
1、构造函数本身也是函数,只不过可以用来创建对象
2、调用方式不同,任何函数只要通过new
操作符来调用,那它就可以作为构造函数(Constructor);不通过new
操作符来调用,那和普通函数没什么区别
通过构造函数创建的实例对象都有一个constructor
(构造函数)属性,该属性指向实例对象的构造函数Person
,请看下面的例子:
1 | function Person(name, age, job) { |
将构造函数当函数来使用
例子如下:
1 | // 当作构造函数使用 |
构造函数的问题
原型模式
Constructor(构造函数)+ 原型模式
动态原型模式
寄生构造函数模式
稳妥构造函数模式
ES6中Class定义类
ES5中提供Object.create()
方法创建
MDN-Object.create()方法创建一个新对象,使用现有的对象来提供新创建的对象的
__proto__
1 | const person = { |