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 相关文章推荐
ExtJS 2.0 GridPanel基本表格简明教程
May 25 Javascript
用apply让javascript函数仅执行一次的代码
Jun 27 Javascript
在IE 浏览器中使用 jquery的fadeIn() 效果 英文字符字体加粗
Jun 02 Javascript
如何学习Javascript入门指导
Nov 01 Javascript
javascript在子页面中函数无法调试问题解决方法
Jan 17 Javascript
JSON格式的键盘编码对照表
Jan 29 Javascript
基于jQuery实现拖拽图标到回收站并删除功能
Nov 25 Javascript
JSON 对象未定义错误的解决方法
Sep 29 Javascript
小程序日历控件使用方法详解
Dec 29 Javascript
后台使用freeMarker和前端使用vue的方法及遇到的问题
Jun 13 Javascript
js表达式与运算符简单操作示例
Feb 15 Javascript
Json实现传值到后台代码实例
Jun 30 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 实现多服务器共享 SESSION 数据
2009/08/15 PHP
浅析php学习的路线图
2013/07/10 PHP
shell脚本作为保证PHP脚本不挂掉的守护进程实例分享
2013/07/15 PHP
一个经典的PHP验证码类分享
2014/11/18 PHP
php获取发送给用户的header信息的方法
2015/03/16 PHP
laravel框架路由分组,中间件,命名空间,子域名,路由前缀实例分析
2020/02/18 PHP
Json对象替换字符串占位符实现代码
2010/11/17 Javascript
JAVASCRIPT函数作用域和提前声明 分享
2013/08/22 Javascript
浅析JavaScript中的typeof运算符
2013/11/30 Javascript
jquery实现将获取的颜色值转换为十六进制形式的方法
2014/12/20 Javascript
jQuery+HTML5加入购物车代码分享
2020/10/29 Javascript
学习javascript面向对象 实例讲解面向对象选项卡
2016/01/04 Javascript
JS仿hao123导航页面图片轮播效果
2016/09/01 Javascript
js与jQuery实现的用户注册协议倒计时功能实例【三种方法】
2017/11/09 jQuery
JavaScript深入V8引擎以及编写优化代码的5个技巧
2019/06/24 Javascript
jquery树形插件zTree高级使用详解
2019/08/16 jQuery
Vue 实现html中根据类型显示内容
2019/10/28 Javascript
Angular8 实现table表格表头固定效果
2020/01/03 Javascript
在Python中使用成员运算符的示例
2015/05/13 Python
Windows安装Python、pip、easy_install的方法
2017/03/05 Python
关于Python数据结构中字典的心得
2017/12/04 Python
matplotlib简介,安装和简单实例代码
2017/12/26 Python
Python实现修改IE注册表功能示例
2018/05/10 Python
多个应用共存的Django配置方法
2018/05/30 Python
详解Python3中的迭代器和生成器及其区别
2018/10/09 Python
使用PIL(Python-Imaging)反转图像的颜色方法
2019/01/24 Python
基于Python2、Python3中reload()的不同用法介绍
2019/08/12 Python
Python装饰器原理与基本用法分析
2020/01/07 Python
python字符串的index和find的区别详解
2020/06/20 Python
Android本地应用打开方法——通过html5写连接
2016/03/11 HTML / CSS
圣诞树世界:Christmas Tree World
2019/12/10 全球购物
将一个文本文件的内容按倒序打印出来
2015/01/05 面试题
库房管理员岗位职责
2014/03/09 职场文书
班主任与学生安全责任书
2014/07/25 职场文书
个人学习总结范文
2015/02/15 职场文书
微信小程序基础教程之echart的使用
2021/06/01 Javascript