JavaScript创建对象简单方式到优化
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JavaScript创建对象简单方式到优化相关的知识,希望对你有一定的参考价值。
上一篇内容我们学习了javascript面向对象的开发思想如何掌握JavaScript面向对象开发相关模式?:下面开始我们今天的学习内容。
一、JavaScript创建对象简单方式
我们可以直接通过 `new Object()` 创建:
var person = new Object()
person.name = Jack
person.age = 18
person.sayName = function ()
console.log(this.name)
每次创建通过 `new Object()` 比较麻烦,所以可以通过它的简写形式对象字面量来创建:
var person =
name: Jack,
age: 18,
sayName: function ()
console.log(this.name)
对于上面的写法固然没有问题,但是假如我们要生成两个 `person` 实例对象呢?
var person1 =
name: Jack,
age: 18,
sayName: function ()
console.log(this.name)
var person2 =
name: Mike,
age: 16,
sayName: function ()
console.log(this.name)
通过上面的代码我们不难看出,这样写的代码太过冗余,重复性太高。
二、简单方式的改进:工厂函数
我们可以写一个函数,解决代码重复问题:
function createPerson (name, age)
return
name: name,
age: age,
sayName: function ()
console.log(this.name)
然后生成实例对象:
var p1 = createPerson(Jack, 18)
var p2 = createPerson(Mike, 18)
这样封装确实爽多了,通过工厂模式我们解决了创建多个相似对象代码冗余的问题,
但却没有解决对象识别的问题(即怎样知道一个对象的类型)。
三、构造函数
内容引导:
- - 构造函数语法
- - 分析构造函数
- - 构造函数和实例对象的关系
- + 实例的 constructor 属性
- + instanceof 操作符
- - 普通函数调用和构造函数调用的区别
- - 构造函数的返回值
- - 构造函数的问题
四、更优雅的工厂函数:构造函数
一种更优雅的工厂函数就是下面这样,构造函数:
function Person (name, age)
this.name = name
this.age = age
this.sayName = function ()
console.log(this.name)
var p1 = new Person(Jack, 18)
p1.sayName() // => Jack
var p2 = new Person(Mike, 23)
p2.sayName() // => Mike
五、解析构造函数代码的执行
在上面的示例中,`Person()` 函数取代了 `createPerson()` 函数,但是实现效果是一样的。
这是为什么呢?
我们注意到,`Person()` 中的代码与 `createPerson()` 有以下几点不同之处:
- 没有显示的创建对象
- 直接将属性和方法赋给了 `this` 对象
- 没有 `return` 语句
- 函数名使用的是大写的 `Person`
而要创建 `Person` 实例,则必须使用 `new` 操作符。
以这种方式调用构造函数会经历以下 4 个步骤:
1. 创建一个新对象
2. 将构造函数的作用域赋给新对象(因此 this 就指向了这个新对象)
3. 执行构造函数中的代码
4. 返回新对象
下面是具体的伪代码:
function Person (name, age)
// 当使用 new 操作符调用 Person() 的时候,实际上这里会先创建一个对象
// var instance =
// 然后让内部的 this 指向 instance 对象
// this = instance
// 接下来所有针对 this 的操作实际上操作的就是 instance
this.name = name
this.age = age
this.sayName = function ()
console.log(this.name)
// 在函数的结尾处会将 this 返回,也就是 instance
// return this
六、构造函数和实例对象的关系
使用构造函数的好处不仅仅在于代码的简洁性,更重要的是我们可以识别对象的具体类型了。
在每一个实例对象中同时有一个 `constructor` 属性,该属性指向创建该实例的构造函数:
console.log(p1.constructor === Person) // => true
console.log(p2.constructor === Person) // => true
console.log(p1.constructor === p2.constructor) // => true
对象的 `constructor` 属性最初是用来标识对象类型的,
但是,如果要检测对象的类型,还是使用 `instanceof` 操作符更可靠一些:
console.log(p1 instanceof Person) // => true
console.log(p2 instanceof Person) // => true
总结:
- 构造函数是根据具体的事物抽象出来的抽象模板
- 实例对象是根据抽象的构造函数模板得到的具体实例对象
- 每一个实例对象都具有一个 `constructor` 属性,指向创建该实例的构造函数
+ 注意: `constructor` 是实例的属性的说法不严谨,具体后面的原型会讲到
- 可以通过实例的 `constructor` 属性判断实例和构造函数之间的关系
+ 注意:这种方式不严谨,推荐使用 `instanceof` 操作符,后面学原型会解释为什么
以上是关于JavaScript创建对象简单方式到优化的主要内容,如果未能解决你的问题,请参考以下文章