<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>西红柿爱番茄 &#187; 继承</title>
	<atom:link href="http://www.ilovejs.net/archives/tag/%e7%bb%a7%e6%89%bf/feed" rel="self" type="application/rss+xml" />
	<link>http://www.ilovejs.net</link>
	<description>到了创造为主的阶段，不忘继续学习</description>
	<lastBuildDate>Thu, 15 Dec 2011 06:18:39 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3</generator>
		<item>
		<title>对于javascript中继承的一些看法</title>
		<link>http://www.ilovejs.net/archives/641</link>
		<comments>http://www.ilovejs.net/archives/641#comments</comments>
		<pubDate>Thu, 13 May 2010 13:23:28 +0000</pubDate>
		<dc:creator>Supersha</dc:creator>
				<category><![CDATA[Javascript]]></category>
		<category><![CDATA[继承]]></category>

		<guid isPermaLink="false">http://www.ilovejs.net/?p=641</guid>
		<description><![CDATA[今天在图书馆看《Ajax企业级开发》这本书时，看到它关于javascript中继承的一些见解，觉得非常不错。并且提出了几点关于在编写javascript继承封装函数的方式时候应该达到的几个目标： 避免在原型阶段调用基类的构造函数。就是在子类实现继承的时候，避免在子类中调用了基类的构造函数来实现继承基类的属性。这点考虑是并无道理的，如果基类的构造函数中有关于DOM操作的执行代码，并且修改了页面的DOM结构，这就会失去了继承的意义了。 避免子类对父类方法的全局调用。就是避免在子类中直接使用基类的名称去调用基类的方法，这样造成对基类名称的依赖性过大，扩展性和维护性不佳。 允许调用基类方法和构造函数。 不要扩展Object.prototype属性。这个主要是避免增加Object类的方法，使得Object类越来越难操纵，尽量保持它的“纯净”，把对性能的影响效果降到最低。 确保不会严重影响性能。 上面罗列的五点，非常具有参考意义。虽然是一些细节问题，可是对于企业级的应用来说，有时候可能就是问题所在。在继承方面，Dean Edwards和Douglas Crockford也做了比较详细的叙述：《http://dean.edwards.name/weblog/2006/03/base/》，《Classical Inheritance in JavaScript》，同时，John Resig也做了相关的叙述：《Simple JavaScript Inheritance》，都非常经典而且具有代表意义。 书中也根据上面的五点，给出了一个extend函数示例： [javascript] var extend=function(subClass,baseClass){ var &#8230; <a href="http://www.ilovejs.net/archives/641" class="more-link">了解更多</a>]]></description>
			<content:encoded><![CDATA[<p>
今天在图书馆看《<a  href="http://product.dangdang.com/product.aspx?product_id=20350608">Ajax企业级开发</a>》这本书时，看到它关于javascript中继承的一些见解，觉得非常不错。并且提出了几点关于在编写javascript继承封装函数的方式时候应该达到的几个目标：
</p>
<ol>
<li>避免在原型阶段调用基类的构造函数。就是在子类实现继承的时候，避免在子类中调用了基类的构造函数来实现继承基类的属性。这点考虑是并无道理的，如果基类的构造函数中有关于DOM操作的执行代码，并且修改了页面的DOM结构，这就会失去了继承的意义了。</li>
<li>避免子类对父类方法的全局调用。就是避免在子类中直接使用基类的名称去调用基类的方法，这样造成对基类名称的依赖性过大，扩展性和维护性不佳。</li>
<li>允许调用基类方法和构造函数。</li>
<li>不要扩展Object.prototype属性。这个主要是避免增加Object类的方法，使得Object类越来越难操纵，尽量保持它的“纯净”，把对性能的影响效果降到最低。</li>
<li>确保不会严重影响性能。</li>
</ol>
<p>
上面罗列的五点，非常具有参考意义。虽然是一些细节问题，可是对于企业级的应用来说，有时候可能就是问题所在。在继承方面，Dean Edwards和Douglas Crockford也做了比较详细的叙述：《<a  href="http://dean.edwards.name/weblog/2006/03/base/">http://dean.edwards.name/weblog/2006/03/base/</a>》，《<a  href="http://www.crockford.com/javascript/inheritance.html">Classical Inheritance in JavaScript</a>》，同时，John Resig也做了相关的叙述：《<a  href="http://ejohn.org/blog/simple-javascript-inheritance/">Simple JavaScript Inheritance</a>》，都非常经典而且具有代表意义。
</p>
<p>书中也根据上面的五点，给出了一个extend函数示例：<br />
[javascript]<br />
  var extend=function(subClass,baseClass){<br />
     var F=function(){};<br />
     F.prototype=baseClass.prototype;<br />
     subClass.prototype=new F();</p>
<p>     subClass.prototype.constructor=subClass;</p>
<p>     subClass.base=baseClass; //本人修改，书中是baseClass.prototype<br />
     return subClass;<br />
  }<br />
[/javascript]</p>
<p>
上面使用了一个临时类F，通过这个临时类，避免了在extend函数内部调用基类的构造函数。通过设置subClass的一个静态方法base来储存基类的引用，这样就可以在子类中调用基类的方法和构造函数，也避免了子类对基类方法的全局调用。extend内部也没有扩展Object.prototype属性。在性能方面，也没有造成什么过大的影响。看起来是比较良好的了。
</p>
<p>但是我的问题来了，如果要实现“避免在原型阶段调用基类的构造函数”这个目标，对于在继承基类中通过this声明的属性是行不通的，比如：<br />
[javascript]<br />
var baseClass=function(name,age){<br />
   this.name=name;<br />
   this.age=age;<br />
}<br />
[/javascript]<br />
就像上面代码所示，如果要避免在子类中调用基类的构造函数的话，上面的name和age属性是不可能被子类继承的。<br />
[javascript]<br />
extend(subClass,baseClass);<br />
function subClass(){};</p>
<p>var sub=new subClass();<br />
alert(sub.name); // return &quot;undefined&quot;<br />
[/javascript]<br />
要继承基类中通过this声明的属性，就必须要在子类中调用基类的构造函数：<br />
[javascript]<br />
extend(subClass,baseClass);<br />
function subClass(name,age,grade){<br />
  subClass.base.call(this,name,age);//调用基类的构造函数来继承属性<br />
  this.grade=grade;<br />
};<br />
[/javascript]<br />
如果没必要通过在基类里通过this来声明属性的话，可以通过prototype在构造函数外部来实现定义属性和方法，这也是从一个原因出发的：尽量保持构造函数的简单，使得类的实例化更加快。这样也可以避免在子类中调用基类的构造函数<br />
[javascript]<br />
var baseClass=function(){};<br />
baseClass.prototype={<br />
   name:&quot;supesha&quot;,<br />
   age:25,<br />
   getName:function(){<br />
      return this.name;<br />
   }<br />
}</p>
<p>extend(subClass,baseClass);<br />
function subClass(grade){<br />
  this.grade=grade;<br />
};<br />
alert((new subClass(&quot;two&quot;)).name);<br />
[/javascript]<br />
如果是如上所述的情况的话，不需要在基类中通过this来声明属性，那么使用foreach循环也是可以实现继承方法的，这样就可以避免使用一个临时类来做“中间人”啦，缺点就是兼容性不好，不能同时兼容使用this声明属性的情况：<br />
[javascript]<br />
var extend=function(subClass,baseClass){<br />
   for(var key in baseClass.prototype){<br />
	subClass.prototype[key]=baseClass.prototype[key];<br />
   }<br />
   subClass.base=baseClass;<br />
   return subClass;<br />
}</p>
<p>var subClass=extend(function(){},baseClass);<br />
[/javascript]</p>
<p>
使用哪种方式，这个可能需要在应用的整体中去考究了。
</p>
<p>
因此，选择实现继承的方式应该遵循上面罗列的五点目标是十分必要的。实现方式多种多样，但是每一种都是在改善原来的继承方式，使得javascript继承更加的强大。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ilovejs.net/archives/641/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>元编程的思想</title>
		<link>http://www.ilovejs.net/archives/332</link>
		<comments>http://www.ilovejs.net/archives/332#comments</comments>
		<pubDate>Sun, 14 Mar 2010 09:56:16 +0000</pubDate>
		<dc:creator>Supersha</dc:creator>
				<category><![CDATA[Javascript]]></category>
		<category><![CDATA[继承]]></category>

		<guid isPermaLink="false">http://www.ilovejs.net/?p=332</guid>
		<description><![CDATA[2010年3月13日的那个中午，踏上火车，回到学校，回到图书馆了，离别了有段日子了，也甚是思念在图书馆的点点滴滴。 “在图书馆翻书看的时候无意中看到一个比较有意思的名词：元编程。自由百科全书的定义如下：编写一些程序来提前生成一些数据或代码供运行时使用，用来生成这些数据信息或者代码的程序称为元程序，编写这种程序就称为元编程。” “接着它又说啦：在Javascript中实践元编程，其中所谓的元程序就是function，而供运行时使用的数据或代码就是Function或function引出的一系列扩展。因为作为一个function，既可以直接执行，有可以充分利用function代码体的上下文，如享受apply或call等方法带来的便利，而作为一个构造方法使用，则受到比较大的限制，缺少了function的灵活性。” 暂且不说它是否说的对与不对，先看它举例的代码再说： [javascript] //createConstructor function createConstructor(fn){ var p=fn.prototype; function func(){} func.prototype=p; func.prototype.constructor=p.constructor; //定义新对象的构造 func.prototype.a=&#34;a&#34;; func.prototype.show=function(){alert(this.a);} } //createFunction var &#8230; <a href="http://www.ilovejs.net/archives/332" class="more-link">了解更多</a>]]></description>
			<content:encoded><![CDATA[<p>
2010年3月13日的那个中午，踏上火车，回到学校，回到图书馆了，离别了有段日子了，也甚是思念在图书馆的点点滴滴。
</p>
<p>
“在图书馆翻书看的时候无意中看到一个比较有意思的名词：元编程。<a  href="http://www.wikipedia.org">自由百科全书</a>的定义如下：编写一些程序来提前生成一些数据或代码供运行时使用，用来生成这些数据信息或者代码的程序称为元程序，编写这种程序就称为元编程。”
</p>
<p>
“接着它又说啦：在Javascript中实践元编程，其中所谓的元程序就是function，而供运行时使用的数据或代码就是Function或function引出的一系列扩展。因为作为一个function，既可以直接执行，有可以充分利用function代码体的上下文，如享受apply或call等方法带来的便利，而作为一个构造方法使用，则受到比较大的限制，缺少了function的灵活性。”
</p>
<p>暂且不说它是否说的对与不对，先看它举例的代码再说：<br />
[javascript]<br />
//createConstructor<br />
function createConstructor(fn){<br />
     var p=fn.prototype;<br />
     function func(){}<br />
     func.prototype=p;<br />
     func.prototype.constructor=p.constructor;<br />
     //定义新对象的构造<br />
     func.prototype.a=&quot;a&quot;;<br />
     func.prototype.show=function(){alert(this.a);}<br />
}</p>
<p>//createFunction<br />
var createFunction=function(fn){<br />
    var f = fn;<br />
    var func=function(){<br />
         return f.apply(this,arguments);<br />
    }<br />
    func.prototype=fn.prototype;<br />
    return func;<br />
[/javascript]<br />
上面既是原书中举的两个例子，初看起来，还比较新颖，可是测试一下发现了一个不足之处，就是创建出来的function或者构造函数，它一变，原始的function或者构造函数也都变了，这个实用性不大。我将它修改一下，就可以实现类似于C++中的基类、子类之间的继承关系了：<br />
[javascript]<br />
function createFunc(fn){<br />
   var f = fn;<br />
   var func = function(){<br />
      return f.apply(this, arguments);<br />
   }<br />
   for (var key in f.prototpe) {   //复制<br />
      func.prototype[key] = f.prototype[key];<br />
   }<br />
   return func;<br />
}<br />
[/javascript]<br />
上面修改过后的是对“基类”的复制，“子类”的修改，不会影响到“基类”。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ilovejs.net/archives/332/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>函数化实现“伪继承机制”</title>
		<link>http://www.ilovejs.net/archives/161</link>
		<comments>http://www.ilovejs.net/archives/161#comments</comments>
		<pubDate>Wed, 06 Jan 2010 08:31:55 +0000</pubDate>
		<dc:creator>Supersha</dc:creator>
				<category><![CDATA[Javascript]]></category>
		<category><![CDATA[函数化]]></category>
		<category><![CDATA[继承]]></category>

		<guid isPermaLink="false">http://www.ilovejs.net/?p=161</guid>
		<description><![CDATA[步骤： 1.创建一个新对象 2.有选择性的定义私有变量和方法，就是函数中通过var声明的普通变量 3.给这个新对象扩充方法 4.返回这个新对象 原理：在继承的时候，在子类中首先获得父类定义的新对象，之后在这个新对象的基础上扩充其他的方法或者重定义父类的方法. 从而达到始终都在操作同一个对象来实现“伪继承”。 [javascript] Function.prototype.method=function(name,fn){ if(!this.prototype[name]){ this.prototype[name]=fn; } return this; } var mammal = function(spec){ var &#8230; <a href="http://www.ilovejs.net/archives/161" class="more-link">了解更多</a>]]></description>
			<content:encoded><![CDATA[<p>
步骤：<br />
1.创建一个新对象<br />
2.有选择性的定义私有变量和方法，就是函数中通过var声明的普通变量<br />
3.给这个新对象扩充方法<br />
4.返回这个新对象</p>
<p>原理：在继承的时候，在子类中首先获得父类定义的新对象，之后在这个新对象的基础上扩充其他的方法或者重定义父类的方法.<br />
从而达到始终都在操作同一个对象来实现“伪继承”。
</p>
<p>[javascript]<br />
Function.prototype.method=function(name,fn){<br />
 if(!this.prototype[name]){<br />
  this.prototype[name]=fn;<br />
 }<br />
 return this;<br />
}<br />
var mammal = function(spec){<br />
      var that = {}; //创建一个新对象<br />
      //给新对象扩充方法<br />
      that.get_name = function(){<br />
            return spec.name;<br />
      };<br />
      that.says = function(){<br />
            return spec.saying || &quot;&quot;;<br />
      };<br />
      //返回这个新对象<br />
      return that;<br />
}</p>
<p>var cat=function(spec){<br />
 spec.saying=spec.saying || meow ;</p>
<p> //调用mammal方法，获得它生成的对象<br />
 var that=mammal(spec); </p>
<p> //在mammal方法返回的对象基础上扩展方法<br />
 that.purr=function(n){<br />
  var i,s=&quot;&quot;;<br />
  for(i=0;i&lt;n;i++){<br />
   if(s){<br />
    s+=&quot;-&quot;;<br />
   }<br />
   s+=&quot;r&quot;;<br />
  }<br />
  return s;<br />
 };<br />
 //重定义get_name方法<br />
 that.get_name=function(){<br />
  return that.says()+&quot; &quot;+spec.name +&quot; &quot;+that.says();<br />
 }<br />
 //返回扩展后的对象<br />
 return that;<br />
}</p>
<p>//Object扩展方法superior，通过参数名称访问父类方法<br />
Object.method( superior ,function(name){<br />
 var that=this,method=that[name];<br />
 return function(){<br />
  return method.apply(that,arguments);<br />
 }<br />
});</p>
<p>var coolcat=function(spec){<br />
 var that=cat(spec);<br />
 var super_get_name=that.superior( get_name ); //获得父类的get_name方法的引用<br />
 //重定义get_name方法<br />
 that.get_name=function(n){<br />
  return Like +super_get_name()+&quot; baby,&quot;+n;<br />
 };<br />
 //返回扩展后的对象<br />
 return that;<br />
}</p>
<p>var myCoolCat=coolcat({name:&quot;Bix&quot;});<br />
alert(myCoolCat.get_name(&quot;supersha&quot;));<br />
[/javascript]</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ilovejs.net/archives/161/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>连缀语法的方式实现继承</title>
		<link>http://www.ilovejs.net/archives/20</link>
		<comments>http://www.ilovejs.net/archives/20#comments</comments>
		<pubDate>Thu, 17 Dec 2009 11:52:19 +0000</pubDate>
		<dc:creator>Supersha</dc:creator>
				<category><![CDATA[Javascript]]></category>
		<category><![CDATA[继承]]></category>

		<guid isPermaLink="false">http://www.ilovejs.net/?p=20</guid>
		<description><![CDATA[javascrpt里继承的方式很多种，有类式继承和原型继承（权威的解释：Prototypal Inheritance in JavaScript Classical Inheritance in JavaScript）。js没有像java那种只要通过一个extends关键字来声明继承的方式，它的实现方式是比较丑陋的，所以封装这个继承过程就显得尤为重要了。 下面我来说明一种链式封装继承的方式，这种方式需要扩展鼎鼎大名的method和inherits扩展方法。method是douglas crockford通过扩展Function类来方便声明方法从而出名。 [javascript] //首先来实现method扩展方法： Function.prototype.method=function(name,fn){ if(!this.prototype.name){ //验证是否已经存在该方法 this.prototype[name]=fn; } return this; } &#8230; <a href="http://www.ilovejs.net/archives/20" class="more-link">了解更多</a>]]></description>
			<content:encoded><![CDATA[<p>
javascrpt里继承的方式很多种，有类式继承和原型继承（权威的解释：<a href="http://javascript.crockford.com/prototypal.html">Prototypal Inheritance in JavaScript</a> <a href="http://javascript.crockford.com/inheritance.html">Classical Inheritance in JavaScript</a>）。js没有像java那种只要通过一个extends关键字来声明继承的方式，它的实现方式是比较丑陋的，所以封装这个继承过程就显得尤为重要了。
</p>
<p>
下面我来说明一种链式封装继承的方式，这种方式需要扩展鼎鼎大名的method和inherits扩展方法。method是<a href="http://www.crockford.com/">douglas crockford</a>通过扩展Function类来方便声明方法从而出名。
</p>
<p>[javascript]<br />
//首先来实现method扩展方法：<br />
Function.prototype.method=function(name,fn){<br />
     if(!this.prototype.name){  //验证是否已经存在该方法<br />
            this.prototype[name]=fn;<br />
     }<br />
     return this;<br />
}</p>
<p>//接下来实现inherits扩展方法，它主要是用于封装继承：<br />
Function.method(&quot;inherits&quot;,function(parent){<br />
     this.prototype=new parent;<br />
     this.prototype.constructor=this; //纠正子类constructor的指向错误<br />
     return this;<br />
}<br />
[/javascript]<br />
<span id="more-20"></span><br />
上面的两个方法是实现所谓的连缀语法继承的基础，接下来看具体的实例就知道了：<br />
[javascript]<br />
//所谓的“父类”<br />
var Person=function(n){<br />
     this.name=n;<br />
}<br />
Person.method(&quot;getName&quot;,function(){<br />
   return this.name;<br />
});<br />
//所谓的“子类”，下面的就是所谓的连缀方式了<br />
var Student=function(n,g){<br />
     Person.call(this,n);<br />
     this.group=g;<br />
}.inherites(Person).method(&quot;getGroup&quot;,function(){<br />
     return this.group;<br />
});<br />
[/javascript]<br />
结语：还是那句话说的好：没事别扩展Javascript的内置类或者对象。这可能导致一些for&#8230;in循环产生怪异的事情。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ilovejs.net/archives/20/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Javascript“继承”的简单理解方式</title>
		<link>http://www.ilovejs.net/archives/11</link>
		<comments>http://www.ilovejs.net/archives/11#comments</comments>
		<pubDate>Tue, 15 Dec 2009 16:41:31 +0000</pubDate>
		<dc:creator>Supersha</dc:creator>
				<category><![CDATA[Javascript]]></category>
		<category><![CDATA[继承]]></category>

		<guid isPermaLink="false">http://www.ilovejs.net/?p=11</guid>
		<description><![CDATA[Javascript里面没有类、继承这样的概念，但是并不代表Javascript不能够实现“继承”。Javascript是一种基于原型链的解释语言，当然也是一种面向对象的语言。既然它面向对象，就不得不需要使用OOP这样的编程方式来编写良好的Javascript代码，编写OOP方式的代码的好处就在于易封装、广重用、易维护等等。Javascript里的知识繁多，现在来简单的讲一下我对Javascript继承的理解。 首先，我们先写一个简单的“父类”Person： [javascript] var Person=function(n){ this.name=n; } Person.prototype={ //这里Person.prototype给赋值了一个对象，有意思 getName:function(){ return this.name; } } [/javascript] 我相信上面的代码是Front-End都能看懂的。上面的代码有意思的地方是Person.prototype给赋值了一个对象。好，下面来简单实现一个“子类”Student： [javascript] var Student=function(n,a){ Person.call(this,n); &#8230; <a href="http://www.ilovejs.net/archives/11" class="more-link">了解更多</a>]]></description>
			<content:encoded><![CDATA[<p>
Javascript里面没有类、继承这样的概念，但是并不代表Javascript不能够实现“继承”。Javascript是一种基于原型链的解释语言，当然也是一种面向对象的语言。既然它面向对象，就不得不需要使用OOP这样的编程方式来编写良好的Javascript代码，编写OOP方式的代码的好处就在于易封装、广重用、易维护等等。Javascript里的知识繁多，现在来简单的讲一下我对Javascript继承的理解。
</p>
<p>首先，我们先写一个简单的“父类”Person：<br />
[javascript]<br />
var Person=function(n){<br />
     this.name=n;<br />
}<br />
Person.prototype={   //这里Person.prototype给赋值了一个对象，有意思<br />
   getName:function(){<br />
     return this.name;<br />
   }<br />
}<br />
[/javascript]<br />
我相信上面的代码是Front-End都能看懂的。上面的代码有意思的地方是Person.prototype给赋值了一个对象。好，下面来简单实现一个“子类”Student：<br />
[javascript]<br />
var Student=function(n,a){<br />
     Person.call(this,n); //这里也非常有意思<br />
     this.age=a;<br />
}<br />
Student.prototype=new Person(); //给Student.prototype赋值了一个Person实例对象，记住，是实例对象。<br />
Student.prototype.getAge=function(){<br />
     return this.age;<br />
}<br />
[/javascript]<br />
<span id="more-11"></span><br />
现在让我们来解释上面的Student的实现继承的方式。在Student内部的Person.call(this,n)，实际上是把Person当作一个函数来调用，并使用了call方法来改变Person内this的上下文为Student，这个时候Person内部的this.name中的this就是Student了，这就给Student子类添加了一个name属性。而之后的Student.prototype被赋值了一个Person的实例对象，下面我们用代码来分析：<br />
[javascript]<br />
//Person实例化后的对象为：<br />
var person=new Person(&quot;ILoveJS&quot;);<br />
//这个时候的person可以理解为这样的了<br />
person={<br />
     name:&quot;ILoveJS&quot;,<br />
     getName:function(){<br />
           return this.name;<br />
     }<br />
}<br />
//当我们把这个person实例对象赋值给Student.prototype的时候，不就像这种方式了吗：<br />
Student.prototype={<br />
     name:&quot;ILoveJS&quot;,<br />
     getName:function(){<br />
           return this.name;<br />
     }<br />
}<br />
//这就扩展了Student.prototype原型的属性和方法了。在加上Student类里面以及最后给它添加的getAge方法，这样Student类就是这样的了：<br />
var Student=function(n,a){<br />
      this.name=n;<br />
      this.age=a;<br />
}<br />
Student.prototype={<br />
      getName:function(){<br />
           return this.name;<br />
      },<br />
      getAge:function(){<br />
           return this.age;<br />
      }<br />
}<br />
[/javascript]<br />
上面分析的就是Student从Person的“继承”过程。其实也都没有什么“继承”机制，无非就是通过扩展prototype/原型和修改context/上下文来达到继承的效果而已。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ilovejs.net/archives/11/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

