JavaScript设计模式之原型模式(Object.create与prototype)介绍


Posted in Javascript onDecember 28, 2014

原型模式说明

说明:使用原型实例来 拷贝 创建新的可定制的对象;新建的对象,不需要知道原对象创建的具体过程;

过程:Prototype => new ProtoExam => clone to new Object;

使用相关代码:

function Prototype() {

    this.name = '';

    this.age = '';

    this.sex = '';

}
Prototype.prototype.userInfo = function() {

    return '个人信息, 姓名: '+this.name+', 年龄: '+this.age+', 性别:'+this.sex+'<br />';

}

现在需要两个或以上的个人信息内容:

var proto = new Prototype();

var person1 = Object.create(proto);

person1.name = '小明';

person1.sex = '男';

person1.age = 35;

person1.userInfo(); 

//

var person2 = Object.create(proto);

person2.name = '小华';

person2.sex = '女';

person2.age = 33;

person2.userInfo();

输出返回:

个人信息, 姓名: 小明, 年龄: 35, 性别: 男

个人信息, 姓名: 小华, 年龄: 33, 性别: 女

原型模式,一般用于 抽象结构复杂,但内容组成差不多,抽象内容可定制,新创建只需在原创建对象上稍微修改即可达到需求的情况;

Object.create 使用说明

1>. 定义: 创建一个可指定原型对象的并可以包含可选自定义属性的对象;
2> Object.create(proto [, properties]);  可选,用于配置新对象的属性;

1. proto: 要创建新对象的 原型,必须,可为 null; 这个 proto 要是已经创建的[new过],或 对象.prototype 才有价值;

2. properties: 可选,结构为:

{

     propField: {

           value: 'val'|{}|function(){},

           writable: true|false,

           enumerable: true|false,

           configurable: true|false,

           get:function(){return 10},

           set:function(value){}

     }

}

自定的属性有以下的四种本置属性:

value: 自定义属性值;

writable: 该项值是否可编辑,默认为 false, 当为 true 时,obj.prodField 可赋值;否则只读;

enumerable: 可枚举; 

confirurable: 可配置;
还可以包含 set, get 访问器方法;
其中,[set, get] 与 value 和 writable 不能同时出现;

1. 创建原型对象类:

function ProtoClass(){

   this.a = 'ProtoClass';

   this.c = {};

   this.b = function() {

   }

}

创建原型方法:
ProtoClass.prototype.aMethod = function() {

     //this.a;

     //this.b();
 return this.a;

}

使用方法

1. 以 ProtoClass.prototype 创建一个对象;

var obj1 = Object.create(ProtoClass.prototype, {

    foo:{value: 'obj1', writable: true}

})

obj1 就具有 ProtoClass 原型方法 aMethod 的方法;
obj1.aMethod();

//就会输出 undefined 方法可访问,ProtoClass 成员无法访问

但是这种方法执行不到 ProtoClass 下 a, b, c 的成员属性:

2. 采用 实例化的 ProtoClass 做原型:

var proto = new ProtoClass();
var obj2 = Object.create(proto, {

    foo:{value:'obj2'}

});

这样创建的 obj2 就具有 ProtoClass 的所有的成员属性 a, b, c 以及 aMethod 原型方法; 并添加了一个 foo 只读 数据属性;
obj2.a; //ProtoClass

obj2.c: //[Object]

obj2.b(); //
obj2.aMethod(); //ProtoClass

obj2.foo; //obj2

3. 子类继承:

function SubClass() {

    

}

SubClass.prototype = Object.create(ProtoClass.prototype ,{

    foo:{value: 'subclass'}

});
SubClass.prototype.subMethod = function() {

     return this.a || this.foo;

}

这种方法可以继承 到 ProtoClass 的 aMethod 方法,执行;

var func = new SubClass();

func.aMethod() ;//undefined,读不到 ProtoClass 的成员属性,a,b,c

func.subMethod();//subclass

要让 SubClass 能读取到 ProtoClass 的成员属性,SubClass 要改下:

function SubClass()

{

    ProtoClass.call(this);

}
//其他代码;

这种方法就可以获取 ProtoClass 的成员属性及原型方法;:

var func = new SubClass();

func.aMethod() ;//ProtoClass

func.subMethod();//ProtoClass

还有一种方法,就是使用 实例化的 ProtoClass 对象,做为 SubClass 的原型;

var proto = new ProtoClass();
function SubClass() {

}
SubClass.prototype = Object.create(proto, {

    foo:{value: 'subclass'}

});

这样 SubClass 实例化后,就可以获取到 ProtoClass 所有的属性及原型方法,以及创建一个只读数据属性 foo;

var func = new SubClass();

func.foo; //subclass

func.a; //ProtoClass

func.b(); //

func.c; //[Object]

func.aMethod(); //ProtoClass

4. 另外的创建继承方法,跟 Object.create 使用 实例化的ProtoClass 做原型 效果一样:

function SubClass() {
this.foo = 'subclass'; //不过这边可读写

}

SubClass.prototype = new ProtoClass();

Object.create 相关说明

Object.create 用于创建一个新的对象,当为 Object 时 prototype 为 null, 作用与 new Object(); 或 {} 一致;

当为 function 时,作用与 new FunctionName 一样;

//1 Object

var o = {}

//等同于

var o2 = Object.create({});

//两者 constructor 一样;
//-----------------------------------------

function func() {

    this.a = 'func';

}

func.prototype.method = function() {

    return this.a;

}
var newfunc = new func();

//等同于[效果一样]

var newfunc2 = Object.create(Object.prototype/*Function.prototype||function(){}*/, {

   a: {value:'func', writable:true},

   method: {value: function() {return this.a;} }

});

但是 newfunc 与 newfunc2 在创建它们的对象的函数引用是不一样的.

newfunc 为 function func() {...},newfunc2 为 function Function { Native }

Object.create(proto[, propertiesField]):

proto 说明,该值为必须,可以为 null, 如果没设定,将会抛出异常;

proto 为非 null, 即为已 实例化的值,即已经 new 过的值;javaScript 中的 对象大多有 constructor 属性,这个属性说明 此对象是通过哪个函数实例化后的对象;

propertiesField 为可选项,设定新创建对象可能需要的成员属性或方法;

Javascript 相关文章推荐
7个Javascript地图脚本整理
Oct 20 Javascript
JavaScript 注册事件代码
Jan 27 Javascript
合并table相同单元格的jquery插件分享(很精简)
Jun 20 Javascript
js综合应用实例简单的表格统计
Sep 03 Javascript
JavaScript中读取和保存文件实例
May 08 Javascript
jQuery实现html表格动态添加新行的方法
May 28 Javascript
Highcharts学习之数据列
Aug 03 Javascript
浅谈React 属性和状态的一些总结
Nov 21 Javascript
js实现一个简单的MVVM框架示例
Jan 15 Javascript
webpack4之SplitChunksPlugin使用指南
Jun 12 Javascript
JavaScript数组排序功能简单实现
May 14 Javascript
详细分析Node.js 模块系统
Jun 28 Javascript
javascript中定义类的方法汇总
Dec 28 #Javascript
js数组的操作指南
Dec 28 #Javascript
JavaScript设计模式之适配器模式介绍
Dec 28 #Javascript
javascript+canvas制作九宫格小程序
Dec 28 #Javascript
JavaScript设计模式之装饰者模式介绍
Dec 28 #Javascript
浅谈Javascript Base64 加密解密
Dec 28 #Javascript
JavaScript设计模式之代理模式介绍
Dec 28 #Javascript
You might like
php 文章调用类代码
2011/08/11 PHP
PHP多线程批量采集下载美女图片的实现代码(续)
2013/06/03 PHP
php实现excel中rank函数功能的方法
2015/01/20 PHP
PHP常用设计模式之委托设计模式
2016/02/13 PHP
javascript iframe内的函数调用实现方法
2009/07/19 Javascript
Jquery之Ajax运用 学习运用篇
2011/09/26 Javascript
你必须知道的Javascript知识点之&quot;深入理解作用域链&quot;的介绍
2013/04/23 Javascript
JavaScript将相对地址转换为绝对地址示例代码
2013/07/19 Javascript
使用Jquery实现点击文字后变成文本框且可修改
2013/09/21 Javascript
JS弹出层的显示与隐藏示例代码
2013/12/27 Javascript
jQuery中offset()方法用法实例
2015/01/16 Javascript
基于javascript实现图片滑动效果
2016/05/07 Javascript
Jquery组件easyUi实现手风琴(折叠面板)示例
2016/08/23 Javascript
bootstrap laydate日期组件使用详解
2017/01/04 Javascript
基于Node.js的WebSocket通信实现
2017/03/11 Javascript
详解nodejs微信公众号开发——6.自定义菜单
2017/04/13 NodeJs
详解AngularJS用Interceptors来统一处理HTTP请求和响应
2017/06/08 Javascript
AngularJS实现的简单拖拽功能示例
2018/01/02 Javascript
改变vue请求过来的数据中的某一项值的方法(详解)
2018/03/08 Javascript
微信小程序中上传图片并进行压缩的实现代码
2018/08/28 Javascript
js中获取URL参数的共用方法getRequest()方法实例详解
2018/10/24 Javascript
Vue批量图片显示时遇到的路径被解析问题
2019/03/28 Javascript
Element-UI中关于table表格的那些骚操作(小结)
2019/08/15 Javascript
列举Python中吸引人的一些特性
2015/04/09 Python
基于python中pygame模块的Linux下安装过程(详解)
2017/11/09 Python
python ftp 按目录结构上传下载的实现代码
2018/09/12 Python
Pytorch使用MNIST数据集实现基础GAN和DCGAN详解
2020/01/10 Python
详解用Python调用百度地图正/逆地理编码API
2020/07/02 Python
如何使用python自带IDLE的几种方法
2020/10/10 Python
html5构建触屏网站之网站尺寸探讨
2013/01/07 HTML / CSS
MATCHESFASHION.COM法国官网:英国奢侈品零售商
2018/01/04 全球购物
人力资源管理专业自荐书范文
2014/02/10 职场文书
户外活动策划方案
2014/03/12 职场文书
四风自我剖析材料
2014/09/30 职场文书
工作失职造成投诉的检讨书范文
2014/10/05 职场文书
2016年社区创先争优活动总结
2016/04/05 职场文书