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 相关文章推荐
javascript dom 操作详解 js加强
Jul 13 Javascript
jQuery中nextAll()方法用法实例
Jan 07 Javascript
jQuery实现简单的图片查看器
Sep 11 Javascript
js实现页面跳转的五种方法推荐
Mar 10 Javascript
原生js实现百叶窗效果及原理介绍
Apr 12 Javascript
jQuery视差滚动效果网页实现方法经验总结
Sep 29 Javascript
微信小程序实现登录遮罩效果
Nov 01 Javascript
VUE中使用MUI方法
Feb 12 Javascript
微信小程序实现上传word、txt、Excel、PPT等文件功能
May 23 Javascript
优雅的处理vue项目异常实战记录
Jun 05 Javascript
jquery实现垂直手风琴菜单
Mar 04 jQuery
如何搭建一个完整的Vue3.0+ts的项目步骤
Oct 18 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
解析二进制流接口应用实例 pack、unpack、ord 函数使用方法
2013/06/18 PHP
CodeIgniter CLI模式简介
2014/06/17 PHP
教你如何解密 “ PHP 神盾解密工具 ”
2014/06/20 PHP
CodeIgniter安全相关设置汇总
2014/07/03 PHP
PHP获取youku视频真实flv文件地址的方法
2014/12/23 PHP
php生成mysql的数据字典
2016/07/07 PHP
PHP实现根据数组某个键值大小进行排序的方法
2018/03/13 PHP
php常用经典函数集锦【数组、字符串、栈、队列、排序等】
2019/08/23 PHP
javascript之bind使用介绍
2011/10/09 Javascript
jquery.ui.draggable中文文档(原文翻译)
2013/11/15 Javascript
javascript验证身份证完全方法具体实现
2013/11/18 Javascript
Jquery图片延迟加载插件jquery.lazyload.js的使用方法
2014/05/21 Javascript
js运动动画的八个知识点
2015/03/12 Javascript
nodejs实现遍历文件夹并统计文件大小
2015/05/28 NodeJs
JS实现网页顶部向下滑出的全国城市切换导航效果
2015/08/22 Javascript
jQuery数据检索中根据关键字快速定位GridView指定行的实现方法
2016/06/08 Javascript
JavaScript面试开发常用的知识点总结
2016/08/08 Javascript
jQuery remove()过滤被删除的元素(推荐)
2017/07/18 jQuery
jQuery+HTML5实现WebGL高性能烟花绽放动画效果【附demo源码下载】
2017/08/18 jQuery
Java设计中的Builder模式的介绍
2018/03/22 Javascript
用jQuery将JavaScript对象转换为querystring查询字符串的方法
2018/11/12 jQuery
JavaScript中callee和caller的区别与用法实例分析
2019/06/28 Javascript
使用Python编写类UNIX系统的命令行工具的教程
2015/04/15 Python
收藏整理的一些Python常用方法和技巧
2015/05/18 Python
Tensorflow实现在训练好的模型上进行测试
2020/01/20 Python
在echarts中图例legend和坐标系grid实现左右布局实例
2020/05/16 Python
NEW LOOK官网:英国时装零售巨头之一,快时尚品牌
2017/01/11 全球购物
双立人加拿大官网:Zwilling加拿大
2020/08/10 全球购物
求职推荐信范文
2013/12/01 职场文书
《乡下孩子》教学反思
2014/04/17 职场文书
理财学专业自荐书
2014/06/28 职场文书
社区领导班子四风问题原因分析及整改措施
2014/09/28 职场文书
幼儿园感恩节活动方案2014
2014/10/11 职场文书
给朋友的赠语
2015/06/23 职场文书
Windows Server 2012 R2 磁盘分区教程
2022/04/29 Servers
volatile保证可见性及重排序方法
2022/08/05 Java/Android