<?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>刘钢的博客 - 我是UED &#187; 面向对象</title>
	<atom:link href="http://www.iamued.com/tag/%e9%9d%a2%e5%90%91%e5%af%b9%e8%b1%a1/feed" rel="self" type="application/rss+xml" />
	<link>http://www.iamued.com</link>
	<description>http://www.IamUED.com</description>
	<lastBuildDate>Wed, 18 Jan 2012 02:51:35 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>JavaScript对象探讨</title>
		<link>http://www.iamued.com/qianduan/786.html</link>
		<comments>http://www.iamued.com/qianduan/786.html#comments</comments>
		<pubDate>Wed, 16 Dec 2009 12:40:04 +0000</pubDate>
		<dc:creator>RichieLiu</dc:creator>
				<category><![CDATA[JavaScript脚本]]></category>
		<category><![CDATA[前端开发]]></category>
		<category><![CDATA[面向对象]]></category>

		<guid isPermaLink="false">http://www.iamued.com/?p=786</guid>
		<description><![CDATA[由于JavaScript的灵活性,可以让每个人按照自己的习惯进行编写代码.有函数式的编程方式,也有现在用的较为广泛的对象字面量.由于面向对象的出现,JavaScript刚开始的函数编程也逐渐演化为类式编程方式.现在我对几种比较熟悉的编程习惯进行简单的说明: 1.对象字面量: 具有JavaScript特色的一种编程方式,以类为单位含有属性name,方法setName和getName.调用方法比较简便person.setname(&#8216;R&#8217;),this由此至终均指向person,person的属性与方法均不私有,可以进行调用. 2.prototype构造器调用模式 也是很常见的编程方式,创建一个Person类,然后利用prototype对类进行扩展,添加方法.与对象字面量最大区别在于,调用该类的方法时,必须先new(跟Java调用类相似).var p = new Person();p.getName();如果不用new,而直接创建,会产生错误.而且这种错误将不会报错,难以发现.错误的产生原因来自于this指向Person.prototypel,而Person并没有setName方法. 3.利用匿名函数进行函数编程 类的出现,其中一个最大的好处就是降低了全局变量的出现,但是如果你依旧习惯于函数式编程,没关系,只要创建一个匿名函数,进行闭包,就可以再里面进行函数编程,也不需要担心全局变量的出现.如上所看到的var name;在匿名函数外部是无法调用的,然后利用外部的变量来调用内部的函数,或者是变量.可以借此创建私有变量和私有方法. 4.类式编程(不知道取什么名) 与对象字面量很相似,其不同之处在于抛开了this,和可以对方法与属性进行私有.调用方法与对象字面量基本一致. 5.方法链 jQuery就是一个最经典的方法连库,如果还不懂方法链是什么,看看这个例子: 由于每个方法的结尾都是return this;所以产生了方法链式的类. 本人比较熟悉的就是这几种方式了,每个人都有每个人的特色,所以方式也是说不尽的.但是借此,我想探讨以下几个问题: 1.有关于this指针 在建立多种类的时候都用到this,可是this的作用究竟是什么,而其实this在重用和继承上起着很大的作用.我们先看看一个关于继承的例子: 首先建立Person类: 然后在建立一个Children类,并集成Person的所有方法和属性: 这就是继承,然后我们看个简单的函数重用: 看了this的作用之后,想必对this有了新的认识了吧.现在就有疑问了,就是this的该用与不该用,下面在看个简单的例子: 就在一个类里,this却指向2处地方,有时这样总会让人觉得困惑.刚学习的人更会被this弄的晕头转向.而稍稍改变一下写代码的方式: 这样一下来,代码可以更加的清晰了.所以编写代码的时候应该考虑好究竟今后的用途,还有能否重用.如果明确了不进行继承或是重用,个人觉得应该尽可能的避免使用this,更有个比较常出现的问题.如下: 前面讲过,若果不写成var p = new Person();p.setName(&#8216;tom&#8217;);该类里的this将会直接指向Person.prototypel.这种错误在编译时,还是运行时都不会报错.有时会造成让人很头痛的问题.所以在编写代码时,我总是很慎重的选用this. 2.类的封装 在Java里,对类的方法或是属性,可以设置为私有,这样就可以避免外部的调用,而JavaScript却不存在这样的设置,看看下面的代码: 在这个类里,一共有2个方法,分别是init和setName,而我们只希望从init中运行setName,或是以后将会为里面添加的各种方法,而不希望出现: 直接调用setName方法,正确的说,希望setName方法私有,还有name属性私有.避免别的程序员使用你的类时,调用了不想被调用的方法. 那应该怎么对类的封装好呢?试试另一种编程方式吧,看看改版的怎么样: 这样子,就可以讲原本要私有化的方法和属性私有化了,外部无法直接调用了.这也是利用了闭包而达成所需要的方式的.可是这种编程方式不易于读,尤其是新手看到这种代码会很吃力,还有在占用内存方面也要比一般的高些. 好了,暂时先介绍到这里,下次有时间在说说闭包与作用域. 转自:http://www.blueidea.com/tech/web/2009/7264.asp]]></description>
			<content:encoded><![CDATA[<p>由于JavaScript的灵活性,可以让每个人按照自己的习惯进行编写代码.有函数式的编程方式,也有现在用的较为广泛的对象字面量.由于面向对象的出现,JavaScript刚开始的函数编程也逐渐演化为类式编程方式.现在我对几种比较熟悉的编程习惯进行简单的说明:<br />
<strong>1.对象字面量:</strong></p>
<pre class="brush: jscript; title: ; notranslate">
var person = {
    name:null,
    setName:function(name){
        this.name = name;
        return this.name;
    },
    getName:function(){
        alert(this.name);
    }
}
</pre>
<p><span id="more-786"></span><br />
具有JavaScript特色的一种编程方式,以类为单位含有属性name,方法setName和getName.调用方法比较简便person.setname(&#8216;R&#8217;),this由此至终均指向person,person的属性与方法均不私有,可以进行调用.</p>
<p><strong>2.prototype构造器调用模式</strong></p>
<pre class="brush: jscript; title: ; notranslate">
var Person = function(){
    this.name = null;
}
Person.prototype.setName = function(name){
    this.name = name;
}
Person.prototype.getName = function(){
    alert(this.name);
}
</pre>
<p>也是很常见的编程方式,创建一个Person类,然后利用prototype对类进行扩展,添加方法.与对象字面量最大区别在于,调用该类的方法时,必须先new(跟Java调用类相似).var p = new Person();p.getName();如果不用new,而直接创建,会产生错误.而且这种错误将不会报错,难以发现.错误的产生原因来自于this指向Person.prototypel,而Person并没有setName方法.</p>
<p><strong>3.利用匿名函数进行函数编程</strong></p>
<pre class="brush: jscript; title: ; notranslate">
(function(){
    var name;

    var setName = function(n){
         name = n;
    }
    window['person']['setName'] = setName;

    var getName = function(){
        alert(name);
    }
    window['person']['getName'] = getName;
})()
</pre>
<p>类的出现,其中一个最大的好处就是降低了全局变量的出现,但是如果你依旧习惯于函数式编程,没关系,只要创建一个匿名函数,进行闭包,就可以再里面进行函数编程,也不需要担心全局变量的出现.如上所看到的var name;在匿名函数外部是无法调用的,然后利用外部的变量来调用内部的函数,或者是变量.可以借此创建私有变量和私有方法.<br />
<strong>4.类式编程(不知道取什么名)</strong></p>
<pre class="brush: jscript; title: ; notranslate">
var person = function(){
    var name = null;
    return{
        setName:function(n){
            name = n;
        },
        getName:function(){
            alert(name);
        }
    }
}
</pre>
<p>与对象字面量很相似,其不同之处在于抛开了this,和可以对方法与属性进行私有.调用方法与对象字面量基本一致.</p>
<p><strong>5.方法链</strong></p>
<pre class="brush: jscript; title: ; notranslate">
var Person = function(){
    this.name = null;
}
Person.prototype = {
    setName:function(name){
        this.name = name;
        return this;
    },
    getName:function(){
        alert(this.name);
        return this;
    }
}
</pre>
<p>jQuery就是一个最经典的方法连库,如果还不懂方法链是什么,看看这个例子:</p>
<pre class="brush: jscript; title: ; notranslate">
var p = new Person();
    p.setName('Tom').getName().setName('Ray').getName();
</pre>
<p>由于每个方法的结尾都是return this;所以产生了方法链式的类.</p>
<p>本人比较熟悉的就是这几种方式了,每个人都有每个人的特色,所以方式也是说不尽的.但是借此,我想探讨以下几个问题:</p>
<p><strong>1.有关于this指针</strong></p>
<p>在建立多种类的时候都用到this,可是this的作用究竟是什么,而其实this在重用和继承上起着很大的作用.我们先看看一个关于继承的例子:<br />
首先建立Person类:</p>
<pre class="brush: jscript; title: ; notranslate">
var Person = function(){
    this.name = null;
}
Person.prototype.setName = function(name){
    this.name = name;
}
Person.prototype.getName = function(){
    alert(this.name);
}
Person.prototype.getAge = function(){
    var age = this.age || '';
    alert(age);
}
</pre>
<p>然后在建立一个Children类,并集成Person的所有方法和属性:</p>
<pre class="brush: jscript; title: ; notranslate">
var Children = function(age){
    this.name = null;
    this.age = age;
}
Children.prototype = new Person();    //继承Person的属性和方法
Children.prototype.ageJudge = function(){    //另外为Children添加新方法
    if(this.age &gt; 18){
        alert('成年人~');
    } else {
        alert('未满18岁呢~');
    }
}
Children.prototype.getName = function(){    //重写getName方法
    var about = this.name + ' ' + this.age;
    alert(about);
}
var tom = new Children(12);
var ages = tom.getAge();    //12
var judge = tom.ageJudge();    //未满18岁呢~
var setN = tom.setName('Tom');
var get = tom.getName();    //Tom 12
</pre>
<p>这就是继承,然后我们看个简单的函数重用:</p>
<pre class="brush: jscript; title: ; notranslate">
var SetColor = function(){
    this.style.backgroundColor = '#000';    //this指向window
}
document.body.onclick = SetColor;    //此时this指向body
documnet.getElementById('color').onmouseout = SetColor;        //this指向documnet.getElementById('color')
</pre>
<p>看了this的作用之后,想必对this有了新的认识了吧.现在就有疑问了,就是this的该用与不该用,下面在看个简单的例子:</p>
<pre class="brush: jscript; title: ; notranslate">
var setColor = {
    init:function(obj){
        this.obj = obj;        //this指向setColor
        this.obj.onclick = this.color;
    },
    color:function(){
        this.style.backgroundColor = '#000';    //this指向obj
    }
}
</pre>
<p>就在一个类里,this却指向2处地方,有时这样总会让人觉得困惑.刚学习的人更会被this弄的晕头转向.而稍稍改变一下写代码的方式:</p>
<pre class="brush: jscript; title: ; notranslate">
var setColor = {
    init:function(obj){
        setColor.obj = obj;
        setColor.obj.onclick = setColor.color;
    },
    color:function(){
        this.style.backgroundColor = '#000';    //this可以方便方法的重用
    }
}
</pre>
<p>这样一下来,代码可以更加的清晰了.所以编写代码的时候应该考虑好究竟今后的用途,还有能否重用.如果明确了不进行继承或是重用,个人觉得应该尽可能的避免使用this,更有个比较常出现的问题.如下:</p>
<pre class="brush: jscript; title: ; notranslate">
var Person = function(){
    this.name = null;
}
Person.prototype.setName = function(name){
    this.name = name;
}
Person.setName('tom');    //错误方式此时setName方法中的this将指向Person.prototypel,Person并没有setName方法
</pre>
<p>前面讲过,若果不写成var p = new Person();p.setName(&#8216;tom&#8217;);该类里的this将会直接指向Person.prototypel.这种错误在编译时,还是运行时都不会报错.有时会造成让人很头痛的问题.所以在编写代码时,我总是很慎重的选用this.</p>
<p><strong>2.类的封装</strong></p>
<p>在Java里,对类的方法或是属性,可以设置为私有,这样就可以避免外部的调用,而JavaScript却不存在这样的设置,看看下面的代码:</p>
<pre class="brush: jscript; title: ; notranslate">
var person = {
    name:null,
    init:function(name){
        this.setName(name);
    }，
    setName:function(name){
        this.name = name;
        return this.name;
    }
}
person.init('tom');    //tom
</pre>
<p>在这个类里,一共有2个方法,分别是init和setName,而我们只希望从init中运行setName,或是以后将会为里面添加的各种方法,而不希望出现:</p>
<pre class="brush: jscript; title: ; notranslate">
person.setName('tom');    //tom
</pre>
<p>直接调用setName方法,正确的说,希望setName方法私有,还有name属性私有.避免别的程序员使用你的类时,调用了不想被调用的方法.<br />
那应该怎么对类的封装好呢?试试另一种编程方式吧,看看改版的怎么样:</p>
<pre class="brush: jscript; title: ; notranslate">
var person = function(){
    var name = null;
    var setName = function(n){
        name = n;
        return name;
    }
    return{
        init:function(n){
            setName(n);
        }
    }
}
</pre>
<p>这样子,就可以讲原本要私有化的方法和属性私有化了,外部无法直接调用了.这也是利用了闭包而达成所需要的方式的.可是这种编程方式不易于读,尤其是新手看到这种代码会很吃力,还有在占用内存方面也要比一般的高些.<br />
好了,暂时先介绍到这里,下次有时间在说说闭包与作用域.<br />
转自:http://www.blueidea.com/tech/web/2009/7264.asp</p>
]]></content:encoded>
			<wfw:commentRss>http://www.iamued.com/qianduan/786.html/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>

