[转贴]JavaScript的Prototype实现

JavaScript - 基于原型(prototype)实现继承 在面向对象编程(OOP)思想中,继承是指类与类之间的关系。但在JS中,没有类的概念。当然我们可以通过构造函数来模拟(实现)类与类之间的关系,那么问题来了,虽然JS模拟了类与类之间的关系,但在JS中又怎样实现继承呢? 原型,使得类与类之间可以实现继承,多个实例对象可以共享一个方法。 如果多个实例对象不共享一个方法,不使用原型概念,会发生什么事情? // 抽象一个数据行为模板(class) // 构造... 阅读详情

写在前面:
    这是我前段时间和Jeff.Yan的一些讨论搞,主要关于JavaScript的Design Pattern,因为没有整理,都是最原始的email内容,我会陆续的贴出一点我给他信,至于他的一些回答和讨论的结果,我会在征求他本人意见的情况下,尽可能完整的贴出来

    因为是和Jeff.Yan的讨论稿,对于我发信内容的发表都同时署名,对于他给我的回信,如果征得他本人同意的情况下在文字中我依然会特别说明。


JavaScript的Prototype实现

作者:Jeff.Yan(阎宏),BlueSwing.Liu(刘如鸿)


模式:
    Prototype(原始模型模式或者原型模式)
定义:
    通过给出一个原型对象来指明所要创建的对象的类型,然后用这个原型对象的方法创建出更多同类型的对象,原始模型模式属于对象的创建模式
 
JavaScript实现:
    在Java语言中对象都继承自java.lang.Object,而java.lang.Object就提供了Clone的方法,只要实现接口Cloneable,即表示支持Clone,否则抛出异常。在这点JavaScript是非常接近的,所有的对象都是从Object继承,不过Object并不支持Clone的方法,但是我们可以通过自己对于JavaScript通过expanddo的形式实现Clone方法,这样日后所有的对象创建都实现了Clone方法。
 
    因为JavaScript本身没有提供Clone的方法,同时对于对象的赋值如var a=new Object();var b=a,这样的代码a,b是指向同一对象的,要创建一个对象必须通过new 这个关键字来实现,因此在Clone的实现过程,我内部定义了一个构造子(constructor)CloneModel,同时指定其父对象为要进行Clone活动本身的对象,因此使用了this关键字,在我们定义的构造子CloneModel的基础上我们创建一个一个对象,因为构造子内部没有任何代码,新创建的对象实际上说所有的实现都在父对象中,也就是我们需要进行Clone的对象。到目前为止,我们已经创建了一个需要复制的对象,但是所有的值都是指向父对象的。
 
    在 JavaScript的面向对象方式中 ,我们曾经讨论过,如果没有覆盖父对象的值,那么这个时候是直接指向父对象的,在Prototype Pattern是要求Clone之后的对象的内部值是不应该相关的,而只要赋值一次,objClone的值都会在自己的内存空间里头,而不是还指向父对象。基于如此的考虑,objClone[v]=objClone[v];语句就是实现将父对象的值通过覆盖的方式拷贝到自己的内存来。(这里提及的内存应该是逻辑意义上的)
 
    深复制的实现
    在完成上述工作之后,只是实现了浅复制,对象方面依然是指向对象的引用,这个时候可以通过调用指向对象的Clone方法得到cloned对象的属性对象(因为不知道如何说了)。objClone[v]=objClone[v].Clone(); 这句代码就是完成如此的功能。

Clone方法的实现
////////////////////////////////////////////////////////////////////// //为Object添加Clone的方法,因为所有的对象的顶级对象都是Object //因此所有用户自定义对象都实现了Clone的方法 ////////////////////////////////////////////////////////////////////// Object.prototype.Clone=function(){ function CloneModel(){ } CloneModel.prototype=this; var objClone=new CloneModel(); var strMsg=""; for( v in objClone){ switch (typeof objClone[v]){ case "function": //如果是方法,不需要进行clone  break; case "object": ///////////////////////////////////////////////////////////////////////  //如果是对象,采用Clone重新得到,这样做的目的在于能够进行深度Clone  //因为JavaScript是一个Object Based的语言,不然内部对象是指向原来的引用  ///////////////////////////////////////////////////////////////////////  objClone[v]=objClone[v].Clone(); break; default: ///////////////////////////////////////////////////////////////////////  //其余数据类型情况下全部重新赋值  //这样做的目的就是保证数值在内存中的存放是在新对象的空间中  //而不仅仅指向Parent Object的一个refrence  ///////////////////////////////////////////////////////////////////////  objClone[v]=objClone[v]; } } return objClone; } 
 
对象类的定义

function BookInfo(vCaption){ this.Caption=vCaption; var curPage=0; this.setPage=function(vData){ curPage=vData; } this.getPage=function(){ return curPage; } } 
 
测试代码

////////////////////////////////// //test BookInfo 's clone method // ////////////////////////////////// function test(){ var objTest=new BookInfo("JavaScript Prototype Pattern"); objTest.setPage(1000); objTest.Author="Ruhong.Liu"; //object expanddo  ShowObject(objTest,"原始对象"); //Clone Object from objTest  var objCloned=objTest.Clone(); ShowObject(objCloned,"Clone之后的对象"); //if you changed the objTest's caption  //you can find objCloned's caption has be changed  objTest.Caption="Changed Base Object"; //show message  ShowObject(objTest,"修改Caption之后的原始对象"); ShowObject(objCloned,"修改Caption之后的clone对象"); /* //----------这段代码可以不工作------------------------// //now you can change objCloned's caption objCloned.Caption="hello,Jeff.Yan"; //show message ShowObject(objTest,"Clone对象Caption修改之后的原始对象"); ShowObject(objCloned,"Clone对象Caption修改以后"); */ } function ShowObject(o,vCaption){ var strMsg=vCaption +"/n"; strMsg+="CurrentPage: " + o.getPage() +"/n"; strMsg+="Caption: " + o.Caption +"/n"; strMsg+="Expanddo Property Author: " + o.Author; alert(strMsg); } 

 
 
结束语:
    按照我目前的理解和测试,我觉得prototype关键字不是prototype模式的实现,这点通过parent object可以得到验证。
JavaScriptprototype属性实现继承 JS并没有显式的继承语法,在JS中所有的对象都是Object的子类实现, 因而对象之间是平等关系. 尽管如此我们可以通过特殊的方法达到继承的效果. 当然JS也不能直接定义类, 我们通过定义函数可以得到一个同名的类 , 同时这个函数就是这个类的构造器, 在定义函数时以this修饰的变量就是定义的 类的实例中的属性,当这个属性时函数时,  就可以认为这个属性变成了一个实例方法 //定义一个P... 阅读详情

相关推荐

JavaScriptPrototype实现

JavaScriptPrototype实现 作者:Jeff.Yan(阎宏),BlueSwing.Liu(刘如鸿) 模式:     Prototype(原始模型模式或者原型模式) 定义:     通过给出一个原型对象来指明所要创建的对象的类型,然后用这个原型对象的方法创建出更多同类型的对象,原始模型模式属于对象的创建模式   JavaScr...

weixin_34352005的博客 76

极经典的JavaScript框架prototype.js中实现继承的方法

 本文非原创    Object.extend = function(destination, source) {for (var property in source) {    destination[property] = source[property];}return destination;}Prototype 对Object类进行的扩展主要通过一个静态函数Object

sunjin1988的专栏 1090

JavaScript通过prototype实现伪继承

传统定义类内的函数的弊端 function Person(name)//定义了一个Person类 { this.name=name; this.info=function()//定义了一个类内部的函数用来输出name { alert("姓名是:"+this.name); } } 如上,我们定义了一个类Person,在类中我们定义了一个成员变量name和输出它的函数info,通过这种方...

英俊帅比林的博客 455

js 采用prototype实现继承

//采用prototype的方式实现js继承         //调用A的构造函数时,没有给他传递参数。这是prototype中标准做法,要确保构造函数没有任何参数         function A() { }         A.prototype.Acolor = "red";         A.prototype.AshowColor = function() {      

菜刀居士的专栏 927

MMSplice实战教程:用Python代码轻松计算基因变异对RNA剪接的影响

MMSplice是一款强大的模块化神经网络工具,专为预测基因变异对pre-mRNA剪接的影响而设计。通过本文的实战教程,即使是新手也能快速掌握如何使用Python代码利用MMSplice计算基因变异对RNA剪接的影响,开启基因数据分析之旅。 ## 🌟 MMSplice简介:基因剪接预测的强大工具 MMSplice采用创新的模块化设计,将外显子及其侧翼内含子分解为五个区域,每个区域由独立的小型

gitblog_00001的博客 361

prototype.js实现AJAX小例子

  原本不知道prototype.js是一个框架,只当其是一个再普通不过的JS文件.随手拿着用了用,写了一个JSP页面,单纯的用prototype.js来实现AJAX效果.用了之后发现超好用,自己再也不用写那么大一堆代码了,哦耶.言归正传,还是把今天写的那个小代码发上来.一.JSP部分     这部分的代码,最为关键的是JS部分的改变.没有采用prototype.js的时候,生成一个A

sliufen的专栏 5596

JS通过prototype实现继承的简单示例:

JS通过prototype实现继承的简单示例:var MYJS={}; MYJS.extend=function(baseClass, prop) { if (typeof (baseClass) === "object") { prop = baseClass; baseClass = null; } // 本次调用所创建的类(构造函数) function F() { }

交换一个思想,能得到俩思想 2865

prototype.js ajax.request,prototype.js简单实现ajax功能示例

本文实例讲述了prototype.js简单实现ajax功能。分享给大家供大家参考,具体如下:原本不知道prototype.js是一个框架,只当其是一个再普通不过的JS文件.随手拿着用了用,写了一个JSP页面,单纯的用prototype.js来实现AJAX效果.用了之后发现超好用,自己再也不用写那么大一堆代码了,哦耶.言归正传,还是把今天写的那个小代码发上来.一.JSP部分这部分的代码,最为关键的是...

weixin_28754365的博客 218

JavaScript prototype原型实现继承

构造简单对象(函数也是一种对象,函数内的函数称为方法) 当然prototype不是专门为解决上面问题而定义的,但是却解决了上面问题。了解了这些知识就可以构建一个科学些的、复用率高的对象, 如果希望实例对象的属性或函数则定义到prototype中,如果希望每个实例单独拥有的属性或方法则定义到this中, 可以通过构造函数传递实例化参数。 代码如下:每个函数都有一个prototype属性,这个属性是指...

友人C君的博客 323

JS中的prototype属性实现继承

在JS中没有类的概念,继承是通过对象和对象之间实现的。其中主要是利用prototype属性来实现的。 函数中的prototype属性,又叫原型对象。构造函数可以通过prototype属性来添加函数。这样做到代码的简单性,避免冗余代码。还可以通过prototype属性来实现继承。 例如: function Person(name,age,email) { this.us

崔博伦 一路有你 2839

JS实现计时器(prototype)+表格排序

有关prototype的解释,请看http://www.uw3c.com/jsviews/js12.html 最近做playmenu餐饮平台项目,厨师端需要计时器来显示菜品从点单到现在已用时间,并且进行降序排序。 因为项目需要,才接触了js。查了下资料,自己用js中functionprototype属性,面向对象实现了一个计时器。 //计时器 function TimeCoun

SamXCode学习博客 714

js中用prototype实现继承

js中用prototype实现继承 Title //prototype 模拟继承 function Person(name,age){ this.name=name; this.age=age; } function Student(){

mischen520的博客 556

js prototype 详解 js实现面向对象

js prototype 详解 prototype只能用在类型上。 以下是一些关于类型和对象的例子,大家看完例子后可能更容易理解类型和对象之间的联系: 1、可以在类型上使用proptotype来为类型添加行为。这些行为只能在类型的实例上体现。 JS中允许的类型有Array, Boolean, Date, Enumerator, Error, Functi

li5220008的专栏 696

prototype实现JavaScript的扩展

prototype实现JavaScript的扩展 Number.prototype.add = function(n){ return(this + n); } var num = (3).add(5); document.write("3+5="+num);

611

利用prototype实现JavaScript继承

本文主要是讲解如何通过prototype实现JavaScript继承,并逐步循序渐进,最终实现一个继承的通用函数。 1.首先我们定义一个父类Father,如下所示: function Father(){ this.name = "姓名"; this.age = "20"; this.setName = function(str){this.name=str};

孙群 2946

JavaScriptPrototype(原型)方式实现

写在前面:    这是我前段时间和Jeff.Yan的一些讨论搞,主要关于JavaScript的Design Pattern,因为没有整理,都是最原始的email内容,我会陆续的贴出一点我给他信,至于他的一些回答和讨论的结果,我会在征求他本人意见的情况下,尽可能完整的贴出来    因为是和Jeff.Yan的讨论稿,对于我发信内容的发表都同时署名,对于他给我的回信,如果征得他本人同意的情况下在文字

9320
上一篇: [转贴]从 ASP.NET 服务器控件插入客户端脚本
下一篇: [转贴]面向对象的JavaScript编程
laily
博客等级 码龄24年 19粉丝 40原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值