1 工厂模式

1.1 创建

function createFruit(name,colors) {
var o = new Object();
o.name = name;
o.colors = colors;
o.getInfo = function () {
console.log(this.name+"是"+this.colors+"的");
}
return o;
}
var apple = createFruit("苹果",["红色","黄色"]);

1.2 说明

利用水果工厂可以很容易的创建一种新的水果,每个新创建的水果都是包括两个属性和一个方法的Object。因为没有水果对象,所以不能通过instanceof得出苹果是水果的结论。

2 构造函数模式

2.1 创建

function Fruit(name,colors) {
this.name = name;
this.colors = colors;
this.getInfo = function () {
console.log(this.name+"是"+this.colors+"的");
}
}
var apple = new Fruit("苹果",["红色","黄色"]);

2.2 说明

利用构造函数模式可以解决对象识别问题,但其主要问题是每个方法在每个实例上重新创建一遍,没有做到方法的重用。

3 原型模式

3.1 创建

function Fruit() {
}
Fruit.prototype.name = "水果";
Fruit.prototype.colors = [];
Fruit.prototype.getInfo = function () {
console.log(this.name+"是"+this.colors+"的");
}
var apple = new Fruit();
apple.name = "苹果";

3.2 说明

原型模式没办法向构造函数传递参数,原型中所有的属性是被多实例共享的,对于引用类型的共享属性的操作可能引起突出的问题。例如向苹果的颜色属性put一个"红色"(apple.colors.push("红色")),哪么所有水果通过原型访问到的颜色都是"红色",而这是很危险的。

4 组合模式(构造函数与原型)

4.1 创建

function Fruit(name,colors) {
this.name = name;
this.colors = colors;
}
Fruit.prototype = {
constructor : Fruit,
getInfo : function () {
console.log(this.name+"是"+this.colors+"的");
}
}
var apple = new Fruit("苹果",["红色","黄色"]);

4.2 说明

组合模式是最常见的创建自定义对象的方式,构造函数模式用于定义实例属性,原型模式用于定义方法和共享属性。可以最大限度的节省内存。

5 动态原型模式

5.1 创建

function Fruit(name,colors) {
this.name = name;
this.colors = colors;
if(typeof this.getInfo != "function") {
Fruit.prototype.getInfo = function () {
console.log(this.name+"是"+this.colors+"的");
};
}
}
var apple = new Fruit("苹果",["红色","黄色"]);

5.2 说明

很完美的方式,把所有信息都封装在构造函数中。只有在getInfo()方法不存在的情况下,才会将它添加到原型中。原型的这段代码只会在初次调用构造函数时才会执行。

6 寄生构造函数模式

6.1 创建

function Fruit(name,colors) {
var o = {};
o.name = name;
o.colors = colors;
o.getInfo = function () {
console.log(this.name+"是"+this.colors+"的");
}
return o;
}
var apple = new Fruit("苹果",["红色","黄色"]);

6.2 说明

这种方式和工厂模式代码其实是一样的,只是函数名采用了Fruit的首字母大写的形式,并且用new来进行初始化。这种模式可以在特殊的情况下用来为对象创建构造函数。

7 稳妥构造函数模式

7.1 创建

function Fruit(name,colors) {
var o = {};
o.getInfo = function () {
console.log(name+"是"+colors+"的");
}
return o;
}
var apple = Fruit("苹果",["红色","黄色"]);

7.2 说明

稳妥对象(durable objects)是由道格拉斯(douglas)发明。指的是没有公共属性,并且其方法也不引用this的对象。适合在安全环境中实用。

JavaScript对象创建的几种方式的更多相关文章

  1. JavaScript对象创建的九种方式

    1.标准创建对象模式 var person = new Object(); person.name = "Nicholas"; person.age = 29; person.jo ...

  2. JS对象创建的几种方式整理

    ​ 本文主要介绍了JS对象创建的几种方式 第一种:Object构造函数创建 var Person = new Object(); Person.name = 'Nike'; Person.age = ...

  3. 对JS关于对象创建的几种方式的整理

    最近一直在看JS高级程序设计这本书,有空来梳理一下几种创建对象的方式.话不多说,直接步入正题. 第一种:Object构造函数创建 var Person = new Object();Person.na ...

  4. 于Unity3D动态创建对象和创建Prefab三种方式的原型对象

    于Unity3D动态创建对象和创建Prefab三种方式的原型对象 u3d在动态创建的对象,需要使用prefab 和创建时 MonoBehaviour.Instantiate( GameObject o ...

  5. 并发编程 ~~~ 多进程~~~进程创建的两种方式, 进程pid, 验证进程之间的空间隔离, 进程对象join方法, 进程对象其他属性

    一 进程创建的两种方式 from multiprocessing import Process import time def task(name): print(f'{name} is runnin ...

  6. Javascript判断数据类型的五种方式及其特殊性

    Javascript判断数据类型的五种方式及区别 @ 目录 typeof instanceof Object.prototype.toString isArray iisNaN ----------- ...

  7. JavaScript声明全局变量的三种方式

    JavaScript声明全局变量的三种方式   JS中声明全局变量主要分为显式声明或者隐式声明下面分别介绍. 声明方式一: 使用var(关键字)+变量名(标识符)的方式在function外部声明,即为 ...

  8. javascript中创建对象的几种方式

    1. 使用Object构造函数来创建一个对象,下面代码创建了一个person对象,并用两种方式打印出了Name的值. var person = new Object(); person.name=&q ...

  9. JavaScript事件处理程序的3种方式

    最近这段时间因为每天要修改网站,为网站做特效,所以看了很多的js接触事件,自己只会使用一小部分,有时用的时候也比较混乱,现在系统的整理了一下,首先跟大家在马海祥博客上跟大家分享的是JavaScript ...

随机推荐

  1. PostgreSql问题:ERROR: column "1" does not exist

    摘录自:http://blog.csdn.net/shuaiwang/article/details/1807421 在PostgreSQL中,不论是在pgAdmin中还是在命令行控制台里面,在SQL ...

  2. Mac下Charles Contents乱码解决办法

    用到Charles,下载最新的4.0.1版本,但是发生乱码问题.百度好久才找到个靠谱的,那些说什么在Info.plist文件加字符串的,都是假的,反正我是试了都没用,这里记下详细的操作步骤解决: 1. ...

  3. scrapy_简介页面和详情页面

    如何对提取的URL进行限定? 往上找id和class属性值,进行多次层级选择,进行内容限定 如何实现获取主页所有urls,然后交给scrapy下载后并解析详情页面,返回结果?(文章简介页面和文章详细页 ...

  4. scrapy_css

    css选择器标准格式:reponse.css(css选择器::获取值) css选择器有哪些? *            选择所有节点 #id         选择id的节点 .container    ...

  5. base64_encode与base64_decode

    base64_encode 编辑 本词条缺少名片图,补充相关内容使词条更完整,还能快速升级,赶紧来编辑吧! base64_encode() returns 使用 base64 对 data 进行编码. ...

  6. MySQL存储过程中declare和set定义变量的区别

    在存储过程中常看到declare定义的变量和@set定义的变量.简单的来说,declare定义的类似是局部变量,@set定义的类似全局变量. 1.declare定义的变量类似java类中的局部变量,仅 ...

  7. java 中字符串比较equals()和equalsIgnoreCase()的区别

    1.使用equals( )方法比较两个字符串是否相等 boolean equals(Object str) 这里str是一个用来与调用字符串(String)对象做比较的字符串(String)对象. 如 ...

  8. JDBC (二)

    1 使用JDBC进行批处理 当需要向数据库发送一批SQL语句的时候,应该避免向数据库一条条的发送执行,而应该采用JDBC的批处理机制,以提高执行效率. 实现批处理的方式一: Statement.add ...

  9. PHP中文网上的分页代码

    page.php <html> <head> <meta http-equiv="CONTENT-TYPE" content="text/h ...

  10. 【转】高精度GPS测量中框架基准的统一

    一.地面基准点的坐标基准转换 一般情况下,我们可以从IERS或IGS等机构获取最新的站坐标和速度场,这些站坐标和速度场是在某一特定基准框架和历元下的坐标值,若要提供高精度GPS网的分析使用,还需要作框 ...