js 对象创建设计模式
创建js对象可以使用多种模式,每种模式有着不同的特点:如下:
1.工厂模式:创建一个函数,在函数中实例化一个对象,当每次调用函数时,就实例化一个对象,并返回这个对象;
我们知道,对象是引用形式的,每次实例化一个对象,就是在内存中开辟一个内存空间,所以每次实例化出来的内存空间是不一样的
一旦执行完调用,就是一个返回一个新对象,和原先调用的函数对象没有关系了
1 <script>
2 function createPeraon(name, age, job) {
3 var o = new Object();
4 o.name = name;
5 o.age = age;
6 o.job = job;
7 o.sayName = function() {
8 console.log(this.name);
9 }
10 return o;
11 }
12
13 var person1 = createPeraon('huanying2015', 25, '程序员工程师');
14 var person2 = createPeraon('aluoha', 26, '架构师');
15 person1.sayName();
16 person2.sayName();
17 </script>

备注:解决了创造多个相似对象的问题
2. 构造函数模式:
函数也是对象,创建一个函数,然后对这个函数的属性和方法进行设置。当需要新对象时,直接实例化这个对象函数,在实例化的时候,一起初始化必要属性,这样,就生成了一个新的对象,构造函数的属性和方法在实例化的新对象中都有,只是对参数进行了初始化
构造函数中,没有返回值
所以,构造函数要想创建新对象,就需要使用 new 来调用
1 <script>
2 function Person(name, age, job) {
3 this.name = name;
4 this.age = age;
5 this.job = job;
6 this.sayName = function() {
7 console.log(this.name);
8 }
9 }
10 var aa = Person('nanna', 18, '学生');
11 console.log(aa); // undefined 没有返回值
12 var person1 = new Person('huanying2015', 25, '程序员工程师');
13 var person2 = new Person('aluoha', 26, '架构师');
14 person1.sayName();
15 person2.sayName();
16 </script>

备注:构造函数的问题,是每个方法都要在实例上重新创建一遍,这样就会造成很多浪费
3.原型模式:
我们把对象的属性和方法都放到函数原型上,这样,在调用的时候,不必重新创建属性和方法,直接就可以调用了;
原型上的属性和方法可以实现共享
1 <script>
2 function Person() {};
3 Person.prototype.name = "huanying2015";
4 Person.prototype.age = 25;
5 Person.prototype.job = "架构师";
6 Person.prototype.sayName = function() {
7 console.log(this.name);
8 }
9 var person1 = new Person();
10 person1.sayName();
11 var person2 = new Person();
12 person2.sayName();
13 console.log(person1.sayName == person2.sayName)
14 </script>

备注:缺点:引用类型的属性如果进行修改,会影响其它实例的结果,因为都指向同一个内存空间
4.构造+原型模式
综合构造和原型模式:把私有属性和方法放在构造函数中,把共有属性和方法放在原型中,这样,私有属性和方法的修改,只会影响操作对象的本身,不会对其他实例造成影响
1 <script>
2 function Person(name, age, job) {
3 this.name = name;
4 this.age = age;
5 this.job = job;
6 this.friends = ['hali', 'jack'];
7 }
8 Person.prototype = {
9 constructor: Person,
10 sayName: function() {
11 console.log(this.name);
12 }
13 }
14
15 var person1 = new Person('huanying2015', 25, '首席架构师');
16 var person2 = new Person('aluoha', 27, '常务事务官');
17
18 person1.sayName();
19 person2.sayName();
20 console.log(person1.sayName == person2.sayName);
21 person1.friends.push('zhangsan');
22
23 console.log(person1.friends);
24 console.log(person2.friends);
25 </script>

5. 动态原型模式:
把所有信息都封装在构造函数中,通过在构造函数中初始化原型(在必要的情况下),又保持了同时使用构造函数和原型的优点。即可以通过先检查某个方法是否 存在有效,来决定是否需要初始化原型
<script>
function Person(name, age, job) {
this.name = name;
this.age = age;
this.job = job;
this.friends = ['hali', 'jack'];
if (typeof this.sayName != "function") {
Person.prototype.sayName = function() {
console.log(this.name);
}
}
} var person1 = new Person('huanying2015', 25, '首席架构师');
var person2 = new Person('aluoha', 27, '常务事务官'); person1.sayName();
person2.sayName();
console.log(person1.sayName == person2.sayName);
</script>

6.寄生构造函数模式:
1 <script>
2 function Person(name, age, job) {
3 var o = new Object();
4 o.name = name;
5 o.age = age;
6 o.job = job;
7 o.sayName = function() {
8 console.log(this.name);
9 }
10 return o;
11 }
12
13 var person1 = new Person('huanying2015', 25, '首席架构师');
14 person1.sayName();
15 </script>

这里:和工厂模式类似,只是使用new 来调用。引申一下,如下:
1 <script>
2 function Person() {
3 var values = new Array();
4 values.push.apply(values, arguments); // 借用数组的方法,将arguments 压入数组对象中
5 values.toPipedString = function() { // 数组对象的方法
6 return this.join("---->");
7 }
8 return values;
9 }
10
11 var person1 = new Person('huanying2015', 25, '首席架构师');
12 console.log(person1.toPipedString());
13 </script>

备注:返回的对象与构造函数,及构造函数的原型之间,没有任何关系,所以,不能使用instanceof 操作符来确定对象类型
7.稳妥构造函数模式:(这里没有搞懂,是瞎写的,以后再来修改)
稳妥构造模式遵循与寄生构造模式类似的模式,也有不同:1.新创建对象的方法,不引用this;2.不使用构造函数调用构造函数
1 <script>
2 function Person(name, age, job) {
3 var o = new Object();
4 o.name = name;
5 o.age = age;
6 o.job = job;
7 o.sayName = function() {
8 console.log(name);
9 }
10 return o;
11 }
12
13 var person1 = Person('huanying2015', 25, '首席架构师');
14 person1.sayName();
15 </script>

js 对象创建设计模式的更多相关文章
- JS对象创建的几种方式整理
本文主要介绍了JS对象创建的几种方式 第一种:Object构造函数创建 var Person = new Object(); Person.name = 'Nike'; Person.age = ...
- JS对象创建模式
JS的对象创建模式 1.Object构造函数模式 var person = new Object(); person.name = 'name'; person.age = 43; console.l ...
- JS对象创建常用方式及原理分析
====此文章是稍早前写的,本次属于文章迁移@2017.06.27==== 前言 俗话说"在js语言中,一切都对象",而且创建对象的方式也有很多种,所以今天我们做一下梳理 最简单的 ...
- JS对象创建的几种方法
最近一直在看JS高级程序设计这本书,有空来梳理一下几种创建对象的方式.话不多说,直接步入正题. 第一种:Object构造函数创建 var Person = new Object(); Person.n ...
- 用js对象创建链表
//以下是一个链表类 function LinkedList(){ //Node表示要加入列表的项 var Node=function(element){ this.element=element; ...
- js学习(六)- js对象创建
//---------------------js文件--------------------- var namespace02=new Object(); namespace02.Person=fu ...
- JS——对象创建
1.原始创建 <script> person = new Object();//不要var person.firstname = "Bill"; person.last ...
- 浅谈Js对象的概念、创建、调用、删除、修改!
一.我们经常困惑,对象究竟是什么,其实这是一种思维,一种意识上的东西,就像我们都说 世界是有物质组成的道理一样,理解了下面的几句话!对象也不是那么抽象! 1.javascript中的所有事 ...
- 在这个看脸的世界,该如何优雅的创建JS对象
Javascript是一门解释型的语言,是基于对象的,严格来说并不怎么符合的面向对象的标准,显著的特点就是函数就是“一等对象”,与传统的面向对象语言不同的时,Javascript有“一千种”方法来创建 ...
随机推荐
- Uc的个人中心很奇葩
Uc的个人中心很奇葩,未登录前点击头像是图2选择性别,点击云同步才是图3登录,登录之后,想退出,要点击图1的头像进入图4编辑资料,然后右上角退出登录…摸索了好久,差点抓狂…把你们的产品经理叫出来一下… ...
- Oracle 表空间的概念
表空间 在数据库系统中,存储空间是较为重要的资源,合理利用空间,不但能节省空间,还可以提高系统的效率和工作性能. Oracle 可以存放海量数据,所有数据都在数据文件中存储.而数据文件大小受操作系 ...
- angular的subscribe
angular中可以使用observable和subscribe实现订阅,从而实现异步. 这里记录一个工作中的小问题,以加深对subscribe的理解.前端技能弱,慢慢积累中. 本来希望的是点击一个按 ...
- [UE4]函数和事件的区别
一.函数有返回值,事件无返回值 二.函数调用会等待函数执行结果,事件调用只是触发但不会等待. 三.函数执行在同一个线程,事件执行在不同线程. 四.函数可以用局部变量,事件没有局部变量. 五.因为函数执 ...
- UE4中使用URL图片
转自:http://www.52vr.com/article-911-1.html
- RAC集群安装校验输出信息
RAC集群安装校验输出信息 作者:Eric 微信:loveoracle11g [grid@rac-node1 grid]$ [grid@rac-node1 grid]$ ./runcluvfy.sh ...
- crm 2016 tabstatechange event
1 tabstatechange事件在窗体中定义 2 问题是如果选项卡默认为折叠的.且选项卡中包含了iFrame网页. 3 在网页内容加载完成之后,点击选项卡 折叠/展开 按钮, iFrame网页没有 ...
- Centos配置iptables开放ftp服务
安装完vsftpd后,默认情况下,CentOS的防火墙是不开放ftp服务的,需要添加模块和开放21端口才能提供ftp访问.1.添加ip_conntrack_ftp 模块[root@hexuweb101 ...
- cocos源码分析--绘制顺序LocalZOrder、GlobalZOrder、OrderOfArrival
使用规则 节点的渲染顺序跟节点的三个成员变量有关(_localZOrder._globalZOrder._orderOfArrival)分别对应三个设置函数setLocalZOrder.setGlob ...
- C#中唯一的三元运算符
条件运算符?:接受三个操作数,是C#中唯一的三元运算符 ; ? : ; //转换成if选择结果如下 ) { j = ; } else { j = ; } 需要根据还可以嵌套三元运算符 ; ) ? : ...