JavaScript对象创建的几种方式
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对象创建的几种方式的更多相关文章
- JavaScript对象创建的九种方式
1.标准创建对象模式 var person = new Object(); person.name = "Nicholas"; person.age = 29; person.jo ...
- JS对象创建的几种方式整理
本文主要介绍了JS对象创建的几种方式 第一种:Object构造函数创建 var Person = new Object(); Person.name = 'Nike'; Person.age = ...
- 对JS关于对象创建的几种方式的整理
最近一直在看JS高级程序设计这本书,有空来梳理一下几种创建对象的方式.话不多说,直接步入正题. 第一种:Object构造函数创建 var Person = new Object();Person.na ...
- 于Unity3D动态创建对象和创建Prefab三种方式的原型对象
于Unity3D动态创建对象和创建Prefab三种方式的原型对象 u3d在动态创建的对象,需要使用prefab 和创建时 MonoBehaviour.Instantiate( GameObject o ...
- 并发编程 ~~~ 多进程~~~进程创建的两种方式, 进程pid, 验证进程之间的空间隔离, 进程对象join方法, 进程对象其他属性
一 进程创建的两种方式 from multiprocessing import Process import time def task(name): print(f'{name} is runnin ...
- Javascript判断数据类型的五种方式及其特殊性
Javascript判断数据类型的五种方式及区别 @ 目录 typeof instanceof Object.prototype.toString isArray iisNaN ----------- ...
- JavaScript声明全局变量的三种方式
JavaScript声明全局变量的三种方式 JS中声明全局变量主要分为显式声明或者隐式声明下面分别介绍. 声明方式一: 使用var(关键字)+变量名(标识符)的方式在function外部声明,即为 ...
- javascript中创建对象的几种方式
1. 使用Object构造函数来创建一个对象,下面代码创建了一个person对象,并用两种方式打印出了Name的值. var person = new Object(); person.name=&q ...
- JavaScript事件处理程序的3种方式
最近这段时间因为每天要修改网站,为网站做特效,所以看了很多的js接触事件,自己只会使用一小部分,有时用的时候也比较混乱,现在系统的整理了一下,首先跟大家在马海祥博客上跟大家分享的是JavaScript ...
随机推荐
- hadoop问题: bin/hadoop fs -ls ls: `.': No such file or directory
问题描述:bin/hadoop fs -ls ls: `.': No such file or directory 问题分析:版本问题,用法不同 https://stackoverflow.com/q ...
- ajax和跨域
一.简介 ajax是什么? AJAX(Asynchronous JavaScript and XML) 是一种在无需重新加载整个网页的情况下,能够更新部分网页的技术. AJAX, (异步的JavaSc ...
- HX711初步处理记录
参考文档为极客工坊大神记录 http://www.geek-workshop.com/forum.php?mod=viewthread&tid=2315&highlight=hx711 ...
- 找不到javax.servlet.Filter类,
找不到javax.servlet.Filter类, 在构建的依赖包中缺少servlet.api
- System包含的信息
System类中的属性值 System.getProperty()方法大全 System.out.println("java版本号:" + System.getProperty(& ...
- linkinFrame--用maven搭项目结构
OK,老早想写一套自己的web框架,然后也一直在看开源的一些框架源码.今天开始正式开始写自己的javaWeb框架,暂时就定义linkinFrame好了. 为什么要写一套自己的框架? 其实这是一个比较矛 ...
- Servlet--ServletContext接口
Servlet--ServletContext接口 定义public interface ServletContext 定义了一个 Servlet 的环境对象,通过这个对象,Servlet 引擎向 S ...
- python交互模式下tab键自动补全
import rlcompleter,readline readline.parse_and_bind('tab:complete')
- 本地工程引入maven工程的配置方式
一.准备 IDE: IntelliJ IDEA 2016.3.1 maven: 3.5.2 JDK: 1.8 操作系统: Window 7 二.配置 1. maven 3.5 下载地址:http:// ...
- CentOS7安装MySQL的方法之RPM包方式
CentOS7安装MySQL的方法之RPM包方式