创建对象的N种模式
1 new Object()
先创建一个Object实例,然后为它添加属性和方法
var Person = new Object()
Person.name = 'hl'
Person.sayName = function () {
console.log(this.name)
}
2 对象字面量法
对象字面量法是创建对象最快捷方便的方式,在很多场景下被使用。
var Person = {
name: 'hl',
sayName: function () {
console.log(this.name)
}
}
对象字面量法的缺点是创建多个同类对象时,会产生大量重复代码,因此有了工厂模式。
3 工厂模式
工厂模式用函数封装了创建对象的细节,调用函数时传入对象属性,然后返回一个对象。
function createPerson (name) {
return {
name: name,
sayName: function () {
console.log(this.name)
}
}
}
var person = createPerson('hl')
var person = new createPerson('hl') // 寄生构造函数模式
通过使用 new 操作符也可以获得同样的结果,这种方法被叫做寄生构造函数模式,(应该)与直接调用函数没什么区别。
工厂模式虽然解决了创建多个同类对象的问题,却无法识别对象是哪种具体类型。
4 构造函数模式
通过构造函数创建的对象,可以使用 instanceof 操作符可以确定对象的类型。按照编程惯例,构造函数命名应该大写,以和普通的函数区别开来。
function Person (name) {
this.name = name
this.sayName = function () {
console.log(this.name)
}
}
p = new Person('hl')
p instanceof Person // true
构造函数的特点:
- 没有显示的创建对象
- 属性和方法直接赋值给this
- 没有 return 语句
- 使用 new 操作符创建对象
构造函数的缺点是每个方法都会在每个实例上重新创建一遍,造成了内存浪费。
5 原型模式
使用原型模式,可以方便的为对象添加属性和方法。
function Person () {
}
var p = new Person()
Person.prototype.name = 'hl'
Person.prototype.sayName = function () {
console.log(this.name)
}
p.sayName() // hl
原型具有动态性,即先创建对象再修改原型,实例也可以获得对应的属性和方法。
原型模式也并非没有缺点,第一,原型模式不能传递初始化参数,导致每个实例都会获得相同的属性;第二,对于引用类型的值,所有实例引用的是同一个对象,看下面的例子:
function Person () {
}
Person.prototype.relative = ['father','mother']
var person1 = new Person()
var person2 = new Person()
person1.relative.push('sister')
console.log(person2.relative) // [ 'father', 'mother', 'sister' ]
修改person1的属性,person2的属性也被修改了。实例一般是需要有属于自己的属性的,因此很少单独使用原型模式。
6 组合使用构造函数模式和原型模式
创建对象最常用的方式,就是组合使用构造函数模式和原型模式。构造函数用于自定义属性,原型模式用于定义共享的属性和方法。
function Person (name) {
this.name = name
}
Person.prototype.sayName = function () {
console.log(this.name)
}
7 动态原型模式
原型可以在构造函数中初始化,以便更好的封装对象创建过程。
function Person(name) {
this.name = name
if (typeof this.sayName !== 'function') {
Person.prototype.setName= function (name) {
this.name = name
}
Person.prototype.sayName = function () {
console.log(this.name)
}
}
}
不必用if检查每一个属性或方法,只需要检查原型初始化后应该存在的其中一个属性或方法即可。
8 稳妥构造函数模式
稳妥对象指的是没有公共属性,其属性和方法也不引用this对象,并且不使用 new 操作符创建对象。适合用在一些需要安全的环境中,防止数据被修改。
function Person (name) {
return {
sayName: function () {
console.log(name)
}
}
}
var person = Person('hl')
稳妥模式创建的对象,除了使用构造函数内定义的方法,没有办法修改和访问传入到构造函数中的原始数据。
创建对象的N种模式的更多相关文章
- javascript 创建对象的7种模式
使用字面量方式创建一个 student 对象: var student = function (){ name : "redjoy", age : 21, sex: women, ...
- JavaScript中创建对象的三种模式
JS中,便于批量创建对象的三种模式: 1.工厂模式:用一个函数封装创建对象的细节,传入必要的参数,在函数内部new一个对象并返回. 缺点:创建的对象无法识别类型(全是Object) 2.构造函数模式: ...
- javascript面向对象系列第二篇——创建对象的5种模式
× 目录 [1]字面量 [2]工厂模式 [3]构造函数[4]原型模式[5]组合模式 前面的话 如何创建对象,或者说如何更优雅的创建对象,一直是一个津津乐道的话题.本文将从最简单的创建对象的方式入手,逐 ...
- javascript创建对象的几种模式
在js中有几种模式可以创建对象,通过对象操作所包含的属性与方法. 一般来说,构造函数名称的第一个字母为大写字母,非构造函数名称的第一个字母为小写字母,当然,构造函数与一般函数唯一的区别只是调用的方式不 ...
- 《JAVASCRIPT高级程序设计》创建对象的七种模式
细看javascript创建对象模式的诞生,具体的脉络为:不使用任何模式——工厂模式——构造函数模式——原型模式——组合使用构造函数模式——动态原型模式——寄生构造函数模式——稳妥构造函数模式.每一种 ...
- JavaScript中的对象-创建对象的7种模式
文章来源:http://blog.csdn.net/u014346301/article/details/52204967 ECMA-262把对象定义为:”无需属性的集合,其属性可以包含基本值.对象或 ...
- 浅谈 JS 创建对象的 8 种模式
1.Object 模式 var o1 = {};//字面量的表现形式 var o2 = new Object; var o3 = new Object(); var o4 = new Object(n ...
- JavaScript中创建对象的几种模式
代码如下: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF ...
- JavaScript 创建对象的几种模式
在JavaScript中虽说可以用Object的构造函数或者字面量创建单个对象,但是用这些方式来创建多个对象时就有一个明显的缺点,产生了大量的重复代码.为解决这些问题,许多模式就应运而生. 1. 工厂 ...
随机推荐
- 腾讯AlloyTeam正式发布Canvas魔幻线条 - curvejs
[原文链接] ## 写在前面 curvejs 中文读["克js"],是腾讯AlloyTeam打造的一款魔幻线条框架,让线条成为一名优秀的舞者,让线条们成为优秀的舞团,HTML5 ...
- HYML / CSS部分
1.什么是盒子模型? 在网页中,一个元素占有空间的大小由几个部分构成,其中包括元素的内容(content),元素的内边距(padding),元素的边框(border),元素的外边距(margin)四个 ...
- 【从无到有】JavaScript新手教程——1.简介、变量和运算符
今天带大家来学习一下在网页制作过程中很常用的JavaScript(简称JS). 一.JS的作用: 表单验证,减轻服务端的压力 添加页面动画效果 动态更改页面内容 Ajax网络请求 二.[使用JS的 ...
- 好久没发贴了,最近捣鼓了个基于node的图片压缩小网站解析。
看了下,距离上次发帖都是去年10月份的事,忙于工作的我很少跑博客园里面来玩了. 做这个小网站的初衷是 https://tinypng.com/ 这个网站有时候访问很慢,然后自己去研究了下图片压缩. 网 ...
- js鼠标移入移出事件会被子元素触发解决方法
问题:js写了一个鼠标移入移出事件,但是发现会被内部子元素不断的触发 解决方法:建立一个空的div定位到需要触发的位置,然后设置大小和触发范围一样,最后将事件写在空的div上.
- ELK logstash 处理MySQL慢查询日志(初步)
写在前面:在做ELK logstash 处理MySQL慢查询日志的时候出现的问题: 1.测试数据库没有慢日志,所以没有日志信息,导致 IP:9200/_plugin/head/界面异常(忽然出现日志数 ...
- ShadowBroker释放的NSA工具中Esteemaudit漏洞复现过程
没有时间测试呢,朋友们都成功复现,放上网盘地址:https://github.com/x0rz/EQGRP 近日臭名昭著的方程式组织工具包再次被公开,TheShadowBrokers在steemit. ...
- Java读取ini配置
本文转载地址: http://www.cnblogs.com/Jermaine/archive/2010/10/24/1859673.html 不够通用,呵呵. 读取ini的配置的格式如下 ...
- html学习笔记 - 标签
单标签 : <!DOCTYPE html> 解析类型标签 <!-- xxx --> 注释标签 <br /> 换行标签 <hr /> 分割线标签 < ...
- JSONObject简介(2)
JSONObject简介 本节摘要:之前对JSON做了一次简单的介 绍,并把JSON和XML做了一个简单的比较:那么,我就在想,如果是一个json格式的字符串传到后台,需要怎么对其处理?如果前台页面需 ...