JavaScript 创建对象的几种模式
在JavaScript中虽说可以用Object的构造函数或者字面量创建单个对象,但是用这些方式来创建多个对象时就有一个明显的缺点,产生了大量的重复代码。为解决这些问题,许多模式就应运而生。
1. 工厂模式
由于在ECMAScript中无法创建类,所以就发明了一种函数,用来封装以特定接口创建对象的细节。
但是以这种方式创建的对象没有解决对象识别问题,即怎样知道一个对象的类型。
function createPerson(name,age,job)
{
var o = new Object();
o.name=name;
o.age=age;
o.job=job;
o.sayHellow=function()
{alert("Hellow"+o.name)};
return o;
} var person1 = createPerson("Jack",34,"Doctor");
2. 构造函数模式
这种方式创建的对象都是属于同一类型的,下面的例子中,所有的对象都是Person类型。
function Person(name,age,job)
{
this.name=name;
this.age=age;
this.job=job;
this.sayName = function()
{
alert("Hello, "+this.name);
}
} var person1 = new Person("Jack",24,"Doctor");
var person2 = new Person("Simon",34,"Teacher"); alert(person1 instanceof Object); // true
alert(person1 instanceof Person); // true
alert(person2 instanceof Object); // true
alert(person2 instanceof Person); // true
但是这个模式也有缺点,那就是每个方法都要在每个对象的实例中重新创建一遍。就如上面的例子,person1 和person2的sayName方法其实不是Function的同一个实例,是位于两个不同位置的函数指针。
所以可以改进下:
function Person(name,age,job)
{
this.name=name;
this.age=age;
this.job=job;
this.sayName = sayName;
}
function sayName()
{
alert("Hello, "+this.name);
} var person1 = new Person("Jack",24,"Doctor");
var person2 = new Person("Simon",34,"Teacher"); alert(person1 instanceof Object); // true
alert(person1 instanceof Person); // true
alert(person2 instanceof Object); // true
alert(person2 instanceof Person); // true
3. 原型模式
想弄明白这个模式,必须要想理解prototype.
这个模式有个很大的问题,就是所有对象的属性和方法都是共享的,但是我们可能仅仅想让Person类共享这个sayName 方法,大家应该都想到了,可以用构造函数模式+原型模式来解决这个问题。
function Person(){}
Person.prototype.name="Jack";
Person.prototype.age=33;
Person.prototype.job="IT";
Person.prototype.sayName = function(){alert("Hellow"+ this.name);};
// 字面量写法
function Person(){}
Person.prototype =
{
name: "Jack",
age: 33,
job: "IT",
sayName=function(){alert("Hellow "+this.name);}
}
4. 组合使用构造函数模式和原型模式
用构造函数定义实例属性,存放不共享的数据,用原型模式定义共享的方法和属性,这样可以尽最大可能减少内存开销。
有点类似于c#类的实例成员和静态成员,但只是像。
这中模式是目前用的最广泛,认可太最高的。
function Person(name,age,job)
{
this.name=name;
this.age=age;
this.job=job;
this.friends=["Toby","Linford"];
}
Person.prototype=
{
constructor: Person,
sayName: function(){alert(this.name);}
} var person1 = new Person("Jack",33,"SDE");
var person2 = new Person("Lucy",25,"Teacher"); person1.friends.push("Jim"); alert(person1.friends); // Toby,Linford,Jim
alert(person2.friends); // Toby,Linford alert(person1.friends==person2.friends); // false
alert(person1.sayName==person2.sayName); //true
5.动态原型模式
function Person(name,age,job)
{
this.name=name;
this.age=age;
this.job=job;
if(typeof sayName != "function")
{
Person.prototype.sayName=function()
{
alert(this.name);
}
};
}
6. 寄生构造函数模式
其基本思想就是一个函数,该函数的作用仅仅就是封装创建对象的代码,然后再返回新创建的对象。
function createPerson(name,age,job)
{
var o = new Object();
o.name=name;
o.age=age;
o.job=job;
o.sayHellow=function()
{alert("Hellow"+o.name)};
return o;
} var person1 = createPerson("Jack",34,"Doctor");
从上面代码看来和工厂模式是一样的。但是这个模式可以在特殊的情况为对象(特别是内置的对象,如Array)添加构造函数。
7.稳妥构造函数模式
和寄生构造函数模式类似,但有两个不同点,一是创建对象的实例方法不引用this,二是不使用new 调用构造函数。
function Person(name, age, job)
{
//定义要返回的对象
var o = new Object();
//定义私有变量和方法 //添加方法
o.sayName=function(){alert(name);}; return o;
}
在上面的例子中,只有通过sayName才可以访问name.
JavaScript 创建对象的几种模式的更多相关文章
- javascript 创建对象的7种模式
使用字面量方式创建一个 student 对象: var student = function (){ name : "redjoy", age : 21, sex: women, ...
- javascript创建对象的几种模式
在js中有几种模式可以创建对象,通过对象操作所包含的属性与方法. 一般来说,构造函数名称的第一个字母为大写字母,非构造函数名称的第一个字母为小写字母,当然,构造函数与一般函数唯一的区别只是调用的方式不 ...
- JavaScript中创建对象的三种模式
JS中,便于批量创建对象的三种模式: 1.工厂模式:用一个函数封装创建对象的细节,传入必要的参数,在函数内部new一个对象并返回. 缺点:创建的对象无法识别类型(全是Object) 2.构造函数模式: ...
- JavaScript 创建对象的七种方式
转自:xxxgitone.github.io/2017/06/10/JavaScript创建对象的七种方式/ JavaScript创建对象的方式有很多,通过Object构造函数或对象字面量的方式也可以 ...
- JavaScript创建对象的几种 方式
//JavaScript创建对象的七种方式 //https://xxxgitone.github.io/2017/06/10/JavaScript%E5%88%9B%E5%BB%BA%E5%AF%B9 ...
- javascript创建对象的方法--原型模式
javascript创建对象的方法--原型模式 一.总结 1.原型模式解决内存浪费的方法(继承):通过继承,对象继承原型模式下的所有属性,对象不同于其它对象的的属性自己创建或者修改 2.原型的使用(p ...
- Javascript 创建对象的三种方法及比较【转载+整理】
https://developer.mozilla.org/zh-CN/docs/JavaScript/Guide/Inheritance_and_the_prototype_chain 本文内容 引 ...
- javascript创建对象的方法--组合模式
javascript创建对象的方法--组合模式 一.总结 0.作用:解决原型模式对象独有属性创建麻烦的问题 1.组合模式使用普遍:jquery就是用的组合模式,组合模式使用非常普遍 2.组合模式优点: ...
- javascript创建对象的方法--构造函数模式
javascript创建对象的方法--构造函数模式 一.总结 构造函数模式作用和不足 1.作用:解决工厂模式不是用new关键字来创建对象的弊端 2.作用:解决工厂模式创建的实例和模型没有内在联系的问题 ...
随机推荐
- yii2 项目初始化
yii 项目目录下执行.composer self-updatecomposer global require "fxp/composer-asset-plugin:^1.4.1" ...
- HDU 6319.Problem A. Ascending Rating-经典滑窗问题求最大值以及COUNT-单调队列 (2018 Multi-University Training Contest 3 1001)
2018 Multi-University Training Contest 3 6319.Problem A. Ascending Rating 题意就是给你长度为k的数列,如果数列长度k<n ...
- [haoi2009]巧克力
鉴于河南是oi弱省,所以想来这道题也没什么人会翻出来写吧,而且这还是haoi2009的一道简单题目,所以估计也没几个人会写博客的,那么看在我这么弱的份上,我觉得是应该写一篇出来的. 这道题我是按照贪心 ...
- 51nod 多重背包问题(动态规划)
多重背包问题 一个背包,承量有限为W,有n种物体,第i种物体,价值Vi,占用重量为 Wi,且有Ci件,选择物品若干放入背包,使得总重量不超过背包的承重.总价值最大? 输入 第1行,2个整数,N和W中间 ...
- HDU1142 A Walk Through the Forest(dijkstra)
A Walk Through the Forest Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Jav ...
- Xamarin XAML语言教程构建ControlTemplate控件模板 (三)
Xamarin XAML语言教程构建ControlTemplate控件模板 (三) (3)打开MainPage.xaml.cs文件,编写代码,实现主题的切换功能.代码如下: using System; ...
- Java加密解密大全
ChinaSEI系列讲义(By 郭克华) Java加密解密方法大全 如果有文字等小错,请多包涵.在不盈利的情况下,欢迎免费传播. 版权所有.郭克华 本讲义经 ...
- [BZOJ 2395] Time is money
Link: BZOJ 2395 传送门 Solution: 算是一类比较经典的模型: 即对于一类经典问题,每点由1个权值化为2个权值,最终求$sigma(val_1)*sigma(val_2)$ 对于 ...
- 【数论】【最大公约数】【枚举约数】CODEVS 1012 最大公约数和最小公倍数问题 2001年NOIP全国联赛普及组
对于一对数(p,q),若它们的gcd为x0,lcm为y0, 则:p*q/x0=y0,即q=x0*y0/p, 由于p.q是正整数,所以p.q都必须是x0*y0的约数. 所以O(sqrt(x0*y0))地 ...
- 前端基础-HTML标记语言
阅读目录 一. HTML标签与文档结构 二. HTML标签详细语法与注意点 三. HTML中标签分类 四. HTML注释 一. HTML标签与文档结构 HTML作为一门标记语言,是通过各种各样的标签来 ...