javascript模式是什么意思?javascript创建对象的几种常用模式介绍
其实javascript模式是什么意思的问题并不复杂,但是又很多的朋友都不太了解javascript创建对象的几种常用模式介绍,因此呢,今天小编就来为大家分享javascript模式是什么意思的一些知识,希望可以帮助到大家,下面我们一起来看看这个问题的分析吧!
javascript创建对象的几种常用模式介绍
本文介绍了javascript中创建对象常用的几种模式,包括:工厂模式,构造函数模式,原型模式,组合构造函数与原型的模式,动态原型模式。
一.工厂模式
看如下代码:
function getMySon(name,sex){
var o={};
o.name=name;
o.sex=sex;
o.sayName= function(){
alert(this.name);
} return o;
}
son1= getMySon('li ming','male');
son2= getMySon('li hong','female');这就是工厂模式。在函数中定义一个对象,并为其添加属性与方法,最后将这个对象返回。虽然这种模式实现了方便的创建对象,但是有这样一个问题,即不能判断这个实例到底是谁创建的。
比如 son1 intanceof getMySon并不能返回 true。因为这里的实例确切来说并不是由getMySon通过new来创建的,而是getMySon中的 o。
所以工厂模式并不适合需要创建很多种对象的情况。
那么怎么创建对象才能正确的判断实例是从哪儿来的呢?下面就要说到构造函数模式了。
二.构造函数模式
看如下代码:
function getMySon(name,sex){
this.name= name;
this.sex= sex;
this.sayName= function(){
alert(this.name);
}
}
son1= new getMySon('li ming','female');这就是构造函数模式,注意在调用时要用 new。
在进行new调用时,进行如下几个步骤:
1.创建一个新的对象(并把空对象的__proto__属性设置为getMySon.prototype)。
2.将构造函数的作用域赋给新对象(此时this指向了这个新对象)。
3.执行构造函数中的代码(通过this为这个新对象添加属性)
4.返回新对象。通过这种方式产生的实例可以使用son1 instanceof getMySon来判断实例是由谁来产生的。
那么使用构造函数有什么问题呢?由于每次使用new时都会创建一个新的对象,那么所有的数据在不同实例之间是不共享的。但是对于函数sayName来说,它并没有必要创建多个。这样做浪费了空间。
这样就引出了下一种,原型模式。
三.原型模式
看如下代码:
function getMySon(){}
getMySon.prototype.name='li ming';
getMySon.prototype.sex='female';
getMySon.prototype.sayName= function(){
alert(this.name);
}这就是原型模式(原型的相关知识这里不详细说)。
原型模式将属性和方法添加到了getMySon.prototype里,prototype由所有的实例共享,它只有一份,并不是所有的实例各有一份。
这种方式实现了让函数只有一份,不必占用多余的空间。但是,name,sex之类的属性并不需要在所有实例间共享,而且使用原型模式进行传参生成这些属性也不方便。
那么可以合并构造函数模式与原型模式,利用它们各自的优点。让各实例间不需要进行共享且需要通过传参进行生成的属性放在构造函数模式中生成,让各实例中需要共享的(比如方法)在原型模式中生成。
三.组合构造函数与原型的模式
看如下代码:
function getMySon(name,sex){
this.name=name;
this.sex=sex;
}
getMySon.prototype.sayName(){
alert(this.name);
}
son1=new getMySon('li ming','female');这是组合构造函数与原型的模式。这种方式结合了构造函数模式与原型模式的优点。这是最常用的一种创建对象的模式。
四.动态原型模式
所谓动态原型模式,其实是对组合构造函数与原型的模式的一种封装。
看如下代码:
function getMySon(name,sex){
this.name= name;
this.sex= sex;//即使有多个需要定义的方法,也只需判断一个方法。
if(typeof sayName!='function'){
getMySon.prototype.sayName=function(){
alert(this.name);
}
}
}
son1=new getMySon('li ming','female');这里之所以命名为动态原型模式,是因为getMySon在不同的调用中会发生变化,是动态的。只有在第一次调用getMySon时才会执行对sayName函数的定义。
从本质来看,仍然是将不需共享的通过构造函数进行定义,需要共享的方法通过原型进行定义。只是将它们放在了一起,进行了封装。
在JavaScript中如何实现观察者模式
下面小编就为大家分享一篇JavaScript原生实现观察者模式的示例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
观察者模式又叫做发布订阅模式,它定义了一种一对多的关系,让多个观察者对象同时监听某一个主题对象,这个主题对象的状态发生改变时就会通知所有观察着对象。它是由两类对象组成,主题和观察者,主题负责发布事件,同时观察者通过订阅这些事件来观察该主体,发布者和订阅者是完全解耦的,彼此不知道对方的存在,两者仅仅共享一个自定义事件的名称。
在Nodejs中通过EventEmitter实现了原生的对于这一模式的支持。
在JavaScript中事件监听机制就可以理解为一种观察者模式。通过onclick进行事件绑定,然后通过交互行为进行触发或者事件主动触发。
下面给出一个JS自定义的PubSub,仔细阅读下面这段代码有助于你理解观察者模式。
一、定义观察者类Pubsub
/* Pubsub*/
function Pubsub(){
//存放事件和对应的处理方法
this.handles={};
}二、实现事件订阅on
//传入事件类型type和事件处理handle
on: function(type, handle){
if(!this.handles[type]){
this.handles[type]= [];
}
this.handles[type].push(handle);
}三、实现事件发布emit
emit: function(){
//通过传入参数获取事件类型
var type= Array.prototype.shift.call(arguments);
if(!this.handles[type]){
return false;
}
for(var i= 0; i< this.handles[type].length; i++){
var handle= this.handles[type][i];
//执行事件
handle.apply(this, arguments);
}
}需要说明的是Array.prototype.shift.call(arguments)这句代码,arguments对象是function的内置对象,可以获取到调用该方法时传入的实参数组。
shift方法取出数组中的第一个参数,就是type类型。
四、实现事件取消订阅off
off: function(type, handle){
handles= this.handles[type];
if(handles){
if(!handle){
handles.length= 0;//清空数组
}else{
for(var i= 0; i< handles.length; i++){
var _handle= handles[i];
if(_handle=== handle){
handles.splice(i,1);
}
}
}
}
}完整代码:
/* Pubsub*/
function Pubsub(){
//存放事件和对应的处理方法
this.handles={};
}
Pubsub.prototype={
//传入事件类型type和事件处理handle
on: function(type, handle){
if(!this.handles[type]){
this.handles[type]= [];
}
this.handles[type].push(handle);
},
emit: function(){
//通过传入参数获取事件类型
var type= Array.prototype.shift.call(arguments);
if(!this.handles[type]){
return false;
}
for(var i= 0; i< this.handles[type].length; i++){
var handle= this.handles[type][i];
//执行事件
handle.apply(this, arguments);
}
},
off: function(type, handle){
handles= this.handles[type];
if(handles){
if(!handle){
handles.length= 0;//清空数组
}else{
for(var i= 0; i< handles.length; i++){
var _handle= handles[i];
if(_handle=== handle){
handles.splice(i,1);
}
}
}
}
}
}五、测试
var p1= new Pubsub();
p1.on('mm', function(name){
console.log('mm:'+ name);
});
p1.emit('mm','哈哈哈哈');
console.log('===============');
var p2= new Pubsub();
var fn= function(name){
console.log('mm2:'+ name);
};
var fn2= function(name){
console.log('mm222:'+ name);
};
p2.on('mm2', fn);
p2.on('mm2', fn2);
p2.emit('mm2','哈2哈2哈2哈2');
console.log('-------------');
p2.off('mm2', fn);
p2.emit('mm2','哈2哈2哈2哈2');
console.log('-------------');
p2.off('mm2');
p2.emit('mm2','哈2哈2哈2哈2');
console.log('-------------');
上面是我整理给大家的,希望今后会对大家有帮助。
相关文章:
在Angular中如何实现敏感文字提示
在Angular中如何实现隐藏显示
在js中如何实现图片左右滑动
javascript中的工厂模式和构造函数有什么区别
工厂模式:就是把参数传进去后。进过一系列的处理。然后得到想要的结果。然而。他这样会很消耗资源。每一次的创建都会创建空间。也就是user.speak=function这边。这样会降低性能。
构造函数也叫混合模式。是通过prototype方法把需要添加的函数在外部添加。也就是不论实例化多少的对象。也不会占用空间。不会消耗性能。
OK,关于javascript模式是什么意思和javascript创建对象的几种常用模式介绍的内容到此结束了,希望对大家有所帮助。