JS面向对象基础讲解(工厂模式、构造函数模式、原型模式、混合模式、动态原型模式)
来源:互联网 发布:同城国际旅行社 java 编辑:程序博客网 时间:2024/06/16 04:42
什么是面向对象?
面向对象可以把程序中的关键模块都视为对象,而模块拥有属性及方法。这样我们如果把一些属性及方法封装起来,日后使用将非常方便,也可以避免繁琐重复的工作。接下来将为大家讲解在Js中面向对象的实现。
工厂模式
工厂模式是软件工程领域一种广为人知的设计模式,而由于在ECMAScript中无法创建类,因此用函数封装以特定接口创建对象。其实现方法非常简单,也就是在函数内创建一个对象,给对象赋予属性及方法再将对象返回即可。
function createBlog(name, url) { var o = new Object(); o.name = name; o.url = url; o.sayUrl = function() { alert(this.url); } return o;}var blog1 = createBlog('zhangsan', 'http://www.baidu.com');
可以看到工厂模式的实现方法非常简单,解决了创建多个相似对象的问题,但是工厂模式却无从识别对象的类型,因为全部都是Object,不像Date、Array等,因此出现了构造函数模式。
构造函数模式
ECMAScript中构造函数可以创建特定类型的对象,类似于Array、Date等原生JS的对象。其实现方法如下:
function Blog(name, url) { this.name = name; this.url = url; this.alertUrl = function() { alert(this.url); }}var blog = new Blog('zhangsan', 'http://www.baidu.com');console.log(blog instaneof Blog);//true, 判断blog是否是Blog的实例;
这个例子与工厂模式中除了函数名不同以外,细心的童鞋应该发现许多不同之处:
函数名首写字母为大写(虽然标准没有严格规定首写字母为大写,但按照惯例,构造函数的首写字母用大写)
没有显示的创建对象
直接将属性和方法赋值给了this对象
没有return语句
使用new创建对象
能够识别对象(这正是构造函数模式胜于工厂模式的地方)
构造函数虽然好用,但也并非没有缺点,使用构造函数的最大的问题在于每次创建实例的时候都要重新创建一次方法(理论上每次创建对象的时候对象的属性均不同,而对象的方法是相同的),然而创建两次完全相同的方法是没有必要的,因此,我们可以将函数移到对象外面。
function Blog(name, url) { this.name = name; this.url = url; this.alertUrl = alertUrl;}function alertUrl() { alert(this.url);} var blog = new Blog('scjb51', 'http://sc.jb51.net/'), blog2 = new Blog('jb51', 'http://www.jb51.net/');blog.alertUrl(); // http://sc.jb51.net/blog2.alertUrl(); // http://www.jb51.net/我们将alertUrl设置成全局函数,这样一来blog与blog2访问的都是同一个函数,可是问题又来了,在全局作用域中定义了一个实际只想让Blog使用的函数,显示让全局作用域有些名副其实,更让人无法接受的是在全局作用域中定义了许多仅供特定对象使用的方法,浪费空间不说,显然失去了面向对象封装性了,因此可以通过原型来解决此问题。
原型模式
我们创建的每个函数都有prototype(原型)属性,这个属性是一个指针,指向一个对象,而这个对象的用途是包含可以由特定类型的所有实例共享的属性和方法。使用原型对象的好处就是可以让所有对象实例共享它所包含的属性及方法。
function Blog() {}Blog.prototype.name = 'wuyuchang';Blog.prototype.url = 'http://tools.jb51.net/';Blog.prototype.friend = ['fr1', 'fr2', 'fr3', 'fr4'];Blog.prototype.alertInfo = function() { alert(this.name + this.url + this.friend );} // 以下为测试代码var blog = new Blog(), blog2 = new Blog();blog.alertInfo(); // wuyuchanghttp://tools.jb51.net/fr1,fr2,fr3,fr4blog2.alertInfo(); // wuyuchanghttp://tools.jb51.net/fr1,fr2,fr3,fr4 blog.name = 'wyc1';blog.url = 'http://***.com';blog.friend.pop();blog2.name = 'wyc2';blog2.url = 'http://+++.com';blog.alertInfo(); // wyc1http://***.comfr1,fr2,fr3blog2.alertInfo(); // wyc2http://+++.comfr1,fr2,fr3原型模式也不是没有缺点,首先,它省略了构造函数传递初始化参数这一环节,结果所有实例在默认情况下都取得了相同的属性值,这样非常不方便,但这还是不是原型的最大问题,原型模式的最大问题在于共享的本性所导致的,由于共享,因此因此一个实例修改了引用,另一个也随之更改了引用。因此我们通常不单独使用原型,而是结合原型模式与构造函数模式。
混合模式(原型模式 + 构造函数模式)
function Blog(name, url, friend) { this.name = name; this.url = url; this.friend = friend;} Blog.prototype.alertInfo = function() { alert(this.name + this.url + this.friend);} var blog = new Blog('wuyuchang', 'http://tools.jb51.net/', ['fr1', 'fr2', 'fr3']), blog2 = new Blog('wyc', 'http://**.com', ['a', 'b']); blog.friend.pop();blog.alertInfo(); // wuyuchanghttp://tools.jb51.net/fr1,fr2blog2.alertInfo(); // wychttp://**.coma,b混合模式中构造函数模式用于定义实例属性,而原型模式用于定义方法和共享属性。每个实例都会有自己的一份实例属性,但同时又共享着方法,最大限度的节省了内存。另外这种模式还支持传递初始参数。优点甚多。这种模式在ECMAScript中是使用最广泛、认同度最高的一种创建自定义对象的方法。
动态原型模式
动态原型模式将所有信息封装在了构造函数中,而通过构造函数中初始化原型(仅第一个对象实例化时初始化原型),这个可以通过判断该方法是否有效而选择是否需要初始化原型。
function Blog(name, url) { this.name = name; this.url = url; if (typeof this.alertInfo != 'function') { // 这段代码只执行了一次 alert('exe time'); Blog.prototype.alertInfo = function() { alert(thia.name + this.url); } }} var blog = new Blog('wuyuchang', 'http://tools.jb51.net'), blog2 = new Blog('wyc', 'http:***.com');可以看到上面的例子中只弹出一次窗,'exe time',即当blog初始化时,这样做blog2就不在需要初始化原型,对于使用这种模式创建对象,可以算是perfect了。
- JS面向对象基础讲解(工厂模式、构造函数模式、原型模式、混合模式、动态原型模式)
- JS面向对象基础讲解(工厂模式、构造函数模式、原型模式、混合模式、动态原型模式)
- JS面向对象基础讲解(工厂模式、构造函数模式、原型模式、混合模式、动态原型模式)
- JS面向对象基础讲解(工厂模式、构造函数模式、原型模式、混合模式、动态原型模式)
- JS面向对象的几种创建方式:工厂模式、构造函数模式、原型模式、混合模式、动态原型模式
- 设计模式---- 单例模式 工厂模式 构造函数模式 原型模式 混合模式
- JS中使用动态原型模式、寄生构造函数模式、稳妥构造函数模式创建对象
- js 创建对象的三种方式——工厂模式、构造函数模式、原型模式
- 对象-工厂模式-构造函数-原型-原型链
- js面向对象小结(工厂模式,构造函数,原型方法,继承)
- 工厂模式、构造函数模式、原型模式范例
- JavaScript构造函数及原型对象 使用Object或对象字面量创建对象 工厂模式创建对象 构造函数模式创建对象 原型模式创建对象 构造与原型混合模式创建对象
- js工厂模式,构建函数模式,原型模式
- Javascript--工厂模式、构造函数、原型
- 对象的创建:工厂模式/构造函数模式/原型模式 (笔记)
- JavaScript中创建对象的方法:工厂模式,构造函数模式, 原型模式
- 构造函数+原型模式构造js自定义对象
- Javascript---字面量创建对象、组合构造函数+原型模式、动态原型模式
- Angular2与AngularJS的区别
- ClassNotFoundException: org.springframework.web.context.ContextLoaderListener正解之一
- jqGrid多次表头排序会累加排序条件问题
- 用栈模拟汉诺塔问题
- SqlServer:使用普通账户登录win7系统时,无法访问.net软件,原因是sql server 数据库拒绝访问,提示user没有权限
- JS面向对象基础讲解(工厂模式、构造函数模式、原型模式、混合模式、动态原型模式)
- hdu 2256 Problem of Precision(矩阵乘法+共轭公式)
- Nodejs笔记(2)——模块
- StoryBoard布局约束注意点
- error LNK2038: 检测到“_MSC_VER”的不匹配项问题
- 面试算法:波浪型数组的快速排序法
- 【文献阅读】Perceptual Generative Adversarial Networks for Small Object Detection –CVPR-2017
- ZOJ 1516 Uncle Tom's Inherited Land (二分图最大匹配)
- Andrew Ng机器学习课程笔记--week3