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 相关文章推荐
vs2003 js文件编码问题的解决方法
Mar 20 Javascript
javascript学习笔记(十六) 系统对话框(alert、confirm、prompt)
Jun 20 Javascript
jQuery模拟超链接点击效果代码
Apr 21 Javascript
js面向对象编程之如何实现方法重载
Jul 02 Javascript
JavaScript取得WEB安全颜色列表的方法
Jul 14 Javascript
JavaScript下的时间格式处理函数Date.prototype.format
Jan 27 Javascript
jQuery基于函数重载实现自定义Alert函数样式的方法
Jul 27 Javascript
node.js实现博客小爬虫的实例代码
Oct 08 Javascript
vue.js表格组件开发的实例详解
Oct 12 Javascript
JavaScript模板引擎Template.js使用详解
Dec 15 Javascript
JS中touchstart事件与click事件冲突的解决方法
Mar 12 Javascript
Vue实现动态查询规则生成组件
May 27 Vue.js
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中对数据库操作的封装
2006/10/09 PHP
php 中的str_replace 函数总结
2007/04/27 PHP
PHP __autoload()方法真的影响性能吗?
2012/03/30 PHP
PHP将两个关联数组合并函数提高函数效率
2014/03/18 PHP
PHP-FPM实现性能优化
2016/03/31 PHP
javascript 设为首页与加入收藏兼容多浏览器代码
2011/01/11 Javascript
express的中间件cookieParser详解
2014/12/04 Javascript
JavaScript Function函数类型介绍
2015/04/08 Javascript
JavaScript中的small()方法使用详解
2015/06/08 Javascript
JS获取时间的相关函数及时间戳与时间日期之间的转换
2016/02/04 Javascript
在JavaScript中模拟类(class)及类的继承关系
2016/05/20 Javascript
AngularJs Forms详解及简单示例
2016/09/01 Javascript
同步异步动态引入js文件的几种方法总结
2016/09/23 Javascript
让IDE识别webpack的别名alias的实现方法
2020/05/06 Javascript
[47:02]2018DOTA2亚洲邀请赛3月29日 小组赛B组 VP VS paiN
2018/03/30 DOTA
[01:01]青春无憾,一战成名——DOTA2全国高校联赛开启
2018/02/25 DOTA
[01:06]DOTA2小知识课堂 Ep.02 吹风竟可解梦境缠绕
2019/12/05 DOTA
python实现DNS正向查询、反向查询的例子
2014/04/25 Python
Python实现LRU算法的2种方法
2015/06/24 Python
Python 中 Meta Classes详解
2016/02/13 Python
Windows下Eclipse+PyDev配置Python+PyQt4开发环境
2016/05/17 Python
Django管理员账号和密码忘记的完美解决方法
2018/12/06 Python
Numpy将二维数组添加到空数组的实现
2019/12/05 Python
python 使用raw socket进行TCP SYN扫描实例
2020/05/05 Python
Python+Django+MySQL实现基于Web版的增删改查的示例代码
2020/05/13 Python
使用Pycharm在运行过程中,查看每个变量的操作(show variables)
2020/06/08 Python
jupyter notebook更换皮肤主题的实现
2021/01/07 Python
Html5导航栏吸顶方案原理与对比实现
2020/06/10 HTML / CSS
介绍一下Prototype的$()函数,$F()函数,$A()函数都是什么作用?
2014/03/05 面试题
英文翻译的自我评价语句
2013/10/04 职场文书
应届生新闻编辑求职信
2013/11/19 职场文书
党员干部承诺书范文
2014/03/25 职场文书
英文求职信范文
2014/05/23 职场文书
副校长个人对照检查材料思想汇报
2014/10/04 职场文书
OpenCV-Python实现人脸美白算法的实例
2021/06/11 Python
python 远程执行命令的详细代码
2022/02/15 Python