javacript 组合使用构造函数模式和原型模式
构造函数模式创建对象
基本方法
function Person(name,age){
this.name=name;
this.age=age;
this.sayName=function(){
alert(this.name)
}
}
var p1=new Person('a1','b1');
var p2=new Person('a2','b2');
alert(p1.sayName===p2.sayName); //false
缺点
每个方法都要在每个实例上创建,由上面的代码可知p1和p2的都有一个sayName方法,但是这两个方法并不是同一个Function的实例,这样就很容易造成资源的浪费
原型模式
定义
我们创建的每个函数都有一个prototype(原型)属性,这个属性是一个指针,指向一个对象,而这个对象的用途是包含可以由特定类型的的所有实例共享的属性和方法
基本方法
function Person(){
}
Person.prototype={
constructor:Person,
name:'fj',
age:10,
friends:['aa','bb'],
sayName:function(){
alert(this.name);
}
}
var p1=new Person();
var p2=new Person();
p1.friend.push('ccc');
alert(p1.friends); //aa,bb,cc
alert(p2.friends); //aa,bb,cc
alert(p1.friends==p2.friends) //true
优点
解决了构造函数模式的不能将对象方法共享的弊端,让所有的对象实例共享他所包含的属性和方法。不用在构造函数中定义对象实例的信息,而是将这些信息直接添加在原型对象中
缺点
原型模式的缺点在于它的共享性,每个实力对象都将拥有相同的属性值,对于基本类型值的属性是没有多大问题的,但是对于引用类型值却是比较有较的问题,就像上面的例子一样p1和p2的frends属性是引用类型值,如果将其中的一个改变,那么另外一个也要改变
组合使用构造函数模式和原模式
定义
构造函数模式定义实例属性,原型模式用来定义方法和共享的属性
function Person(name,age){
this.name=name;
this.age=age;
this.friends=['aa','bb'];
}
Person.prototype={
constructor:Person,
sayName:function(){
alert(this.name);
}
}
var p1=new Person('a1','b1');
var p2=new Person('a2','b2');
p1.friend.push('ccc');
alert(p1.friends); //aa,bb,cc
alert(p2.friends); //aa,bb
alert(p1.friends==p2.friends) //false
alert(p1.sayName===p2.sayName); //true
优点
综合了构造函数模式和原型模式都优点,使每个实例都有自己的一份实例属性的副本,又同时共享着对方法的引用,最大的节省了内存
总结
我觉得构造函数模式就像是css中的style属性,可以为每个对象定义不同的值,而原型模式就是css中的class,可以用在每个对象上,每个对象的方法都相同,只要改变原型中的方法,所有的实例都会被改变,就像class一样,改变里面的样式,所有被引用的元素都会改变样式
javacript 组合使用构造函数模式和原型模式的更多相关文章
- JavaScript之面向对象学习六原型模式创建对象的问题,组合使用构造函数模式和原型模式创建对象
一.仔细分析前面的原型模式创建对象的方法,发现原型模式创建对象,也存在一些问题,如下: 1.它省略了为构造函数传递初始化参数这个环节,结果所有实例在默认的情况下都将取得相同的属性值,这还不是最大的问题 ...
- 【js基础】创建对象的几种常见模式(工厂模式,构造函数模式,原型模式,构造原型组合模式)
一.工厂模式 缺点:没有解决对象识别的问题 优点:解决了创建多个相似对象的问题 function createPerson(name,age,job){ var o = new Object(); o ...
- JS中使用组合构造函数模式和原型模式
创建自定义类型的最常见方式,就是组合使用构造函数模式与原型模式.构造函数模式用于定义实例属性,而原型模式用于定义方法和共享的属性. 结果,每个实例都会有自己的一份实例属性的副本,但同时又共享着对方法的 ...
- JS面向对象(1)——构造函数模式和原型模式
1.构造函数模式 构造函数用来创建特定的类型的对象.如下所示: function Person(name,age,job){ this.name=name; this.job=job; this.ag ...
- javascript 面向对象编程(工厂模式、构造函数模式、原型模式)
javascript 面向对象编程(工厂模式.构造函数模式.原型模式) CreateTime--2018年3月29日17:09:38 Author:Marydon 一.工厂模式 /** * 工厂模 ...
- js设计模式:工厂模式、构造函数模式、原型模式、混合模式
一.js面向对象程序 var o1 = new Object(); o1.name = "宾宾"; o1.sex = "男"; o1.a ...
- JS面向对象基础讲解(工厂模式、构造函数模式、原型模式、混合模式、动态原型模式)
什么是面向对象?面向对象是一种思想. 面向对象可以把程序中的关键模块都视为对象, 而模块拥有属性及方法. 这样如果我们把一些属性及方法封装起来,日后使用将非常方便,也可以避免繁琐重复的工作. 工厂 ...
- 初涉JavaScript模式 (7) : 原型模式 【三】
组合使用构造函数模式和原型模式 上篇,我们提到了原型模式的缺点,就是每个实例不能拥有自己的属性,因为纯原型模式所有的属性都是公开给每个实例的,故我们可以组合使用构造函数模式和原型模式.构造函数用来定义 ...
- javascript创建对象之函数构造模式和原型模式结合使用(四)
创建自定义类型的常见方式就是组合使用构造函数模式与原型模式一起使用. 构造函数模式用于定义实例对象的特有的部分(属性和方法),原型模式用于定义共享的部分. 这样最大限度的节省了内存的开销. funct ...
随机推荐
- 多个tab选项卡
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- Array对象的方法详情
题外话:从事前端开发有很长一段时间了,一直在不断的扩充各种框架的学习,总觉得要学的东西好多,但是技能并没有得到很大的提升,后发现自己一味去追求的它的广度,并没用去深究其深度,所以决定打算从零开始,从最 ...
- set排序(个人模版)
set排序: #include<stdio.h> #include<string.h> #include<iostream> #include<set> ...
- 我的第一个网页制作:Hello World!
这是我花了一个晚上搞的一个Hello World!也只会Hello World!慢慢学,要努力成为大神(黑客专家) 下面给出HTML代码: <html> <head> < ...
- printf不能直接输出string类型
因为string不是c语言的内置数据,所以直接printf输出string类型的是办不到的.要这样输出: printf("%s\n",a.c_str()); 举例: #includ ...
- NYoj_49开心的小明
开心的小明 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描述 小明今天很开心,家里购置的新房就要领钥匙了,新房里有一间他自己专用的很宽敞的房间.更让他高兴的是,妈妈昨天对他 ...
- Quick Brown Fox
The quick brown fox jumps over the lazy dog
- flume1.8 Channel类型介绍(四)
1. Flume Channel Channels是events在agent上进行的存储库.Source添加events,Sink移除events. 1.1 Memory Channel(内存Chan ...
- jQuery中获取文档的高度、可视区域高度以及滚动条距页面顶部的高度
在写页面的时候,经常会碰到这样的情况,就是要获取文档的高度.可视区域高度或者滚动条距页面顶部的高度等情况. 但我总是有些爱搞混淆了,这里还是简单做个笔记吧,这里只限于使用jQuery来获取. 1.获取 ...
- 算法-java代码实现选择排序
选择排序