<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[Heck's  Blog]]></title> 
<link>https://www.heckjj.com/index.php</link> 
<description><![CDATA[一瞬间的决定，往往可以改变很多，事实上，让自己成功的往往不是知识，是精神！ 如果你总是为自己找借口，那只好让成功推迟。执行力，今天！]]></description> 
<language>zh-cn</language> 
<copyright><![CDATA[Heck's  Blog]]></copyright>
<item>
<link>https://www.heckjj.com/oop-javascript-code-html/</link>
<title><![CDATA[面向对象的JavaScript编程 ]]></title> 
<author>Heck &lt;@hecks.tk&gt;</author>
<category><![CDATA[前端开发]]></category>
<pubDate>Tue, 21 Sep 2010 06:31:07 +0000</pubDate> 
<guid>https://www.heckjj.com/oop-javascript-code-html/</guid> 
<description>
<![CDATA[ 
	<span style="font-family: 微软雅黑;"><span style="font-size: 14px;"><strong><span style="color: #4169E1;">一、引言</span></strong></span><br/><br/> 这么久以来，JavaScript在Web开发中一直处于被忽视的地位，甚至有相当一部分开发人员对它产生了误解，认为JavaScript只不过是用来完成一些花哨功能的雕虫小技。网络上广为流传的低质量的JavaScript代码对此也起到了推波助澜的作用...很多应用中JavaScript都采用了面向过程的编程方式，代码的可扩展性不好，复制粘贴的代码比比皆是...<br/>&nbsp;&nbsp;随着Ajax等技术的广泛使用，YUI、Prototype等对JavaScript的应用可谓是淋漓尽致、出神入化。人们才发现原来JavaScript可以实现如此强大的功能，具备如此优雅的架构...<br/><span style="font-size: 14px;"><strong><span style="color: #4169E1;">二、准备</span></strong></span><br/><br/><strong>1、概念</strong><br/><br/>JavaScript是一种弱类型语言。包括：<br/>基本类型：数字Number，字符串String，布尔值Boolean；<br/>复合类型：对象Object，数组Array；<br/>工具类型：全局对象Global，日期Date，数学对象Math，正则表达式RegExp，错误对象Error；<br/>特殊类型：函数Function。<br/><br/>这里我只想说两点：<br/>1）基本数据类型的包装对象<br/>每一个基本数据类型都有一个对应的对象类。可以灵活地实现类型转换。简单地说，JavaScript不仅支持数字、字符串和布尔值这些数据类型，还支持Number、String、Boolean类，这些类是基本数据类型的包装(wrapper)。<br/>例子：</span><textarea name="code" class="js" rows="15" cols="100">
var s="some string";
var len=s.length;</textarea><br/><span style="font-family: 微软雅黑;">这里，s保存了一个字符串，原始的字符串值是不会改变的。一个新的String对象被创建了，实现了对长度属性的访问，之后它就被销毁了。</span><span style="font-family: 微软雅黑;"><br/>其它例子：</span><textarea name="code" class="js" rows="15" cols="100">
var a="some string";
var b=new String("some string");
var c=["a","b","c"];
var d=new Array("a","b","c");

alert(typeof a);//string
alert(a instanceof String);//false
alert(a instanceof Object);//false

alert(typeof b);//object
alert(b instanceof String);//true
alert(b instanceof Object);//true

alert(typeof c);//object
alert(c instanceof Array);//true
alert(c instanceof Object);//true

alert(typeof d);//object
alert(d instanceof Array);//true
alert(d instanceof Object);//true</textarea><br/><br/><span style="font-family: 微软雅黑;"><strong>2）Function类型</strong><br/>做为JavaScript的一种特殊类型，我们将看到函数在面向对象编程中起到了非常关键的作用。<br/><br/>2.值和引用<br/><br/>类型&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 复制&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;传递&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;比较<br/>数字&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 值&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 值&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;值<br/>布尔值&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;值&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 值&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;值<br/>字符串&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;不可变的&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;不可变的&nbsp;&nbsp;&nbsp;&nbsp; 值<br/>对象&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 引用&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;引用&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 引用<br/>函数&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 引用&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;引用&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 引用<br/>数组&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 引用&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;引用&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 引用<br/> <br/>例子：</span><textarea name="code" class="js" rows="15" cols="100">
var s1="hello";
var s2="hell"+"o";
alert(s1==s2);//true

var d1=new Date();
var d2=new Date();
alert(d1==d2);//false</textarea><br/><br/><span style="font-family: 微软雅黑;">3.this<br/>在构造函数中，指代新创建的对象实例；<br/>在对象的方法被调用时，指代调用该方法的对象实例。<br/><br/>4.arguments<br/>arguments属性由解释器创建，用于访问函数对象的每一个参数。<br/><br/>5.callee,caller<br/>arguments的callee属性获取对正在执行的Function对象的引用；<br/>Function对象的caller属性获取正在调用当前函数的父函数对象。<br/><br/>6.apply,call<br/>两者都是将函数绑定到其它对象上执行的，区别在于调用方式：</span><textarea name="code" class="js" rows="15" cols="100">
apply([thisObj[,argArray]])
call([thisObj[,arg1[,arg2[,[,.argN]]]]])</textarea><br/><br/><span style="font-family: 微软雅黑;">7.匿名函数</span><textarea name="code" class="js" rows="15" cols="100">
(function(a,b)&#123;
 return a+b;
 &#125;)(1,1);
等价于：
function f(a,b)&#123;
 return a+b;
&#125;
f(1,1);</textarea><br/><br/><span style="font-family: 微软雅黑;">8.null,undefined<br/>null是JavaScript的关键字，表示空值。可以看作Object类型的一个特殊值。<br/>undefined不是关键字，它是一个全局变量，使用了未定义变量、变量未赋值、void运算符，都会返回“undefined”。<br/><br/>9.constructor<br/>从JavaScript1.1开始，每个对象都具有一个constructor属性，它引用的是用来初始化该对象的构造函数。<br/><br/>10.prototype<br/>JavaScript1.1引入了原型对象的概念，每一个对象都有一个原型对象，对象可以继承它的原型对象的所有属性和方法。<br/>要为一个对象的类制定原型对象，需要将构造函数的prototype属性设置为指定的对象。之后，如果用构造函数初始化对象时，会自动将指定的对象作为新创建对象的原型对象。<br/><br/>注意：<br/>1）使用原型对象可以减少每个继承对象的内存需求量；<br/>2）即使属性是在对象被创建后才加到它的原型对象中的，对象也能够继承这些后定义的属性。<br/>3）当调用一个对象的一个属性时，先在该对象定义内查找该属性，如果没有该属性才到该对象的原型对象中查找，依此类推。<br/><br/><span style="font-size: 14px;"><strong><span style="color: #4169E1;">三、实现</span></strong></span><br/><br/>在面向对象编程中，我们可以把过程编程中的一个个function看作一个个独立定义的类，函数名即为类名。<br/><strong>1.例子：Circle类</strong></span><br/><textarea name="code" class="js" rows="15" cols="100">
function Circle(radius)&#123;
 //实例变量
 this.r=radius;
&#125;

//静态变量
Circle.PI=3.14159;

//实例方法
Circle.prototype.area=function()&#123;
 return Circle.PI*this.r*this.r;
&#125;

//静态方法
Circle.max=function(a,b)&#123;
 if(a.r>=b.r)&#123;
&nbsp;&nbsp;return a;
 &#125;
 else&#123;
&nbsp;&nbsp;return b;
 &#125;
&#125;

//调用
var a=new Circle(2);
var b=new Circle(3);
var c=a.area();
var d=Circle.max(a,b);</textarea><br/><span style="font-family: 微软雅黑;">2.继承<br/><br/><br/>1）一种继承方式<br/></span><textarea name="code" class="js" rows="15" cols="100">
//这里我们将CircleMore类的prototype指向了一个Circle类实例，
//并增加了circumference方法。
function CircleMore(radius)&#123;
 this.r=radius;
&#125;

CircleMore.prototype=new Circle(0);

CircleMore.prototype.circumference=function()&#123;
 return 2*Circle.PI*this.r;
&#125;</textarea><br/><br/><span style="font-family: 微软雅黑;">这样能够实现对Circle的继承，但是这里存在一点问题：我们直接把CircleMore类的prototype指向了一个Circle类实例，这样就覆盖了JavaScript提供的原型对象，而且抛弃了给定的 constructor属性，这样CircleMore的constructor属性就指向了父类Circle的constructor属性。而且这种方式总是使人感觉怪怪的。<br/><br/>2)Ajax架构Prototype（区别前面提到的prototype哦）的继承方式<br/></span><textarea name="code" class="js" rows="15" cols="100">
//Prototype框架为Object对象定义了extend方法，
//将source的属性和方法复制到了destination。
Object.extend = function(destination, source) &#123;
&nbsp;&nbsp;for (var property in source)
&nbsp;&nbsp;&nbsp;&nbsp;destination[property] = source[property];
&nbsp;&nbsp;return destination;
&#125;;

//调用
function ParentClass()&#123;...&#125;
function SubClass()&#123;&#125;
SubClass.prototype=Object.extend(&#123;
 newMethod:function()&#123;
&nbsp;&nbsp;alert("newMethod");
 &#125;
&#125;,
ParentClass.prototype
);</textarea><span style="font-family: 微软雅黑;"><br/><br/>3）如果这里对两个参数交换位置，则是对原对象的开展。<br/>例子：通过extend方法对String对象进行了扩展<br/></span><textarea name="code" class="js" rows="15" cols="100">
Object.extend(String.prototype,&#123;
 newMethod:function()&#123;
&nbsp;&nbsp;alert("newMethod");
 &#125;
&#125;);</textarea><br/><span style="font-family: 微软雅黑;">3.多态</span><br/><textarea name="code" class="js" rows="15" cols="100">
Object.extend = function(destination, source) &#123;
&nbsp;&nbsp;for (var property in source)
&nbsp;&nbsp;&nbsp;&nbsp;destination[property] = source[property];
&nbsp;&nbsp;return destination;
&#125;

//基类
function base()&#123;&#125;
base.prototype=&#123;
 initialize:function()&#123;
&nbsp;&nbsp;this.oninit();//调用了一个虚方法
 &#125;
&#125;

//子类SubClassA
function SubClassA()&#123;&#125;
SubClassA.prototype=Object.extend(&#123;
 //...其它属性方法
 prop:"SubClassA",
 oninit:function()&#123;
&nbsp;&nbsp;alert(this.prop);
 &#125;&#125;,
 base.prototype
&#125;

//子类SubClassB
function SubClassB()&#123;&#125;
SubClassB.prototype=Object.extend(&#123;
 //...其它属性方法
 prop:"SubClassB",
 oninit:function()&#123;
&nbsp;&nbsp;alert(this.prop);
 &#125;&#125;,
 base.prototype
&#125;

//调用
var a=new SubClassA();
var b=new SubClassB();</textarea><br/><span style="font-family: 微软雅黑;"><br/><span style="color: #4169E1;">a.initialize();//输出"SubClassA"<br/>b.initialize();//输出"SubClassB"</span><br/><br/><span style="font-size: 14px;"><strong><span style="color: #4169E1;">四、JavaScript与设计模式</span></strong></span><br/><br/>1.Singleton</span><br/><textarea name="code" class="js" rows="15" cols="100">
function Singleton()&#123;
 if(Singleton.caller!=Singleton.getInstance)&#123;
&nbsp;&nbsp;throw new Error("Can not new Singleton instance!");
 &#125;
 this.prop="some string";
 //...
&#125;

Singleton._instance=null;

Singleton.getInstance=function()&#123;
 if(this._instance==null)&#123;
&nbsp;&nbsp;this._instance=new Singleton();
 &#125;
 return this._instance;
&#125;

var a=Singleton.getInstance();
var b=Singleton.getInstance();
b.prop="another string";
alert(a.prop);//"another string"
alert(b.prop);//"another string"

2.Factory

function XMLHttpFactory()&#123;&#125;

XMLHttpFactory.createXMLHttp=function()&#123;
 if(...)&#123;
&nbsp;&nbsp;return new XMLHttpRequest();
 &#125;
 else if(...)&#123;
&nbsp;&nbsp;return new ActiveXObject("MSXML2.XMLHttp");
 &#125;
 ...
&#125;

var xmlhttp=XMLHttpFactory.createXMLHttp();</textarea><br/><span style="font-family: 微软雅黑;"><span style="font-size: 14px;"><strong><span style="color: #4169E1;">五、备注</span></strong></span><br/><br/>参考资料：<br/>《JavaScript权威指南(第三版)》 中国电力出版社<br/>《JavaScript高级程序设计与应用实例》 人民邮电出版社<br/> Prototype 1.6.0<br/> YUI 2.3.1</span><br/>Tags - <a href="https://www.heckjj.com/tags/javascript/" rel="tag">javascript</a> , <a href="https://www.heckjj.com/tags/%25E9%259D%25A2%25E5%2590%2591%25E5%25AF%25B9%25E8%25B1%25A1/" rel="tag">面向对象</a>
]]>
</description>
</item><item>
<link>https://www.heckjj.com/oop-javascript-code-html/#blogcomment</link>
<title><![CDATA[[评论] 面向对象的JavaScript编程 ]]></title> 
<author> &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate> 
<guid>https://www.heckjj.com/oop-javascript-code-html/#blogcomment</guid> 
<description>
<![CDATA[ 
	
]]>
</description>
</item>
</channel>
</rss>