javascript 객체지향 프로그래밍 함수는 class_js 객체지향이기도 합니다.

WBOY
풀어 주다: 2016-05-16 18:46:16
원래의
920명이 탐색했습니다.

但javascript中并没有类概念,所谓的类也是模拟而来,通过函数加闭包模拟出类成员及私有成员(关于闭包可以参见跨越边界: 闭包)。这里我们将用比较平实的方式来了解一下javascript中的”类”,避开一些生硬的原理。

      既然是用function来模拟类,所以编写代码创建类的关键字还是function。我们创建一个座标点类。

    <span class="kwrd">function</span> Point() {
로그인 후 복사
      <span class="kwrd">this</span>.X = 0;
로그인 후 복사
      <span class="kwrd">this</span>.Y = 0;
로그인 후 복사
    };
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사
 
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사
    <span class="kwrd">var</span> zeroPoint = <span class="kwrd">new</span> Point();
로그인 후 복사
    alert(<span class="str">"当前座标值( X:"</span> + zeroPoint.X + <span class="str">" , Y:"</span> + zeroPoint.Y + <span class="str">" )"</span>);
로그인 후 복사

        image

      大家都知道非静态类成员的访问需要通过对象来完成,所以先new出了一个Point类型对象,再通过该对象完成X和Y轴座标值的访问。从语法上来说,javascript类对象的创建过程和C#等差不多,但实现机制却不相同。这里的new创建出了一个Object,后续的Point()函数执行时将其this指向了这个新的Object对象。Point中的this.X和this.Y是Point类的两个公共成员,所以Point的对象可以直接对它们进行访问。

      说到类成员或对象的成员,免不了要提到可访问性的问题。在javascript的类中,也有public成员和private成员之分,但究其细节却不尽相同。javascript私有成员也是些在类外部不可以通过对象进行操作的成员,其实在类的内部成员之间私有成员也不定能被访问。在类的内部一般只有私有成员和私有成员之间可以互相的访问,你可以认为其它成员权限不够不能操作这些隐私的东西,但如果你有特权,那就不一样了,管它私有公开照用不误。私有成员变量和普通变量声明一样,用var关键字,私有方法可以用var声明变量来接收方法对象,也可以像普通方法那样去构建。

    <span class="kwrd">function</span> Lady() {
로그인 후 복사
로그인 후 복사
      <span class="kwrd">var</span> age = 30;
로그인 후 복사
로그인 후 복사
      <span class="kwrd">var</span> name = <span class="str">"菜花"</span>;
로그인 후 복사
 
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사
      <span class="kwrd">var</span> think = <span class="kwrd">function</span>() {
로그인 후 복사
로그인 후 복사
        alert(<span class="str">"其实我今年"</span> + age + <span class="str">"岁。"</span>);
로그인 후 복사
로그인 후 복사
      };
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사
      
로그인 후 복사
      <span class="kwrd">function</span> fancy(){
로그인 후 복사
        alert(<span class="str">"幻想变成20岁。"</span>);
로그인 후 복사
로그인 후 복사
      };
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사
 
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사
      <span class="kwrd">this</span>.Introduce = <span class="kwrd">function</span>() {
로그인 후 복사
로그인 후 복사
        alert(<span class="str">"我叫"</span> + name + <span class="str">" , 今年20岁。"</span>);
로그인 후 복사
      };
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사
    };
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사
 
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사
    <span class="kwrd">var</span> younglady = <span class="kwrd">new</span> Lady();
로그인 후 복사
로그인 후 복사
    alert(younglady.age);<span class="rem">//结果undefined</span>
로그인 후 복사
    younglady.think(); <span class="rem">//不支持</span>
로그인 후 복사
    younglady.fancy(); <span class="rem">//不支持</span>
로그인 후 복사

      上面是一个Lady类,age、think、fancy都是私有成员,think和fancy方法可以访问age和name,think和fancy两个方法也可以互相进行调用。但它们是私有的,所以创建出来的youngLady对象并不能调用到age、think和fancy,当然也不能调用到name。如果私有成员只能互相之间调用,其实也就失去了私有成员存在的意义。javascript提供特权成员可以建立外界和私有成员互通的桥梁。特权成员是公共成员的一种,公共成员有普通公共成员、特权成员和对象公共成员。

      特权成员就是在类中用this.XX的方式建立的成员,它们可以通过对象来被调用,它们也可以访问私有成员,可以建立私有成员被访问的通道。

    <span class="kwrd">function</span> Lady() {
로그인 후 복사
로그인 후 복사
      <span class="kwrd">var</span> age = 30;
로그인 후 복사
로그인 후 복사
      <span class="kwrd">this</span>.Name = <span class="str">"菜花"</span>;
로그인 후 복사
 
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사
      <span class="kwrd">var</span> think = <span class="kwrd">function</span>() {
로그인 후 복사
로그인 후 복사
        alert(<span class="str">"其实我今年"</span> + age + <span class="str">"岁。"</span>);
로그인 후 복사
로그인 후 복사
      };
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사
 
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사
      <span class="kwrd">function</span> fancy() {
로그인 후 복사
        alert(<span class="str">"幻想变成20岁。"</span>);
로그인 후 복사
로그인 후 복사
      };
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사
 
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사
      <span class="kwrd">this</span>.Introduce = <span class="kwrd">function</span>() {
로그인 후 복사
로그인 후 복사
        alert(<span class="str">"我叫"</span> + <span class="kwrd">this</span>.Name + <span class="str">" , 今年"</span> + age + <span class="str">"岁。"</span>);
로그인 후 복사
      };
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사
    };
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사
 
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사
    <span class="kwrd">var</span> younglady = <span class="kwrd">new</span> Lady();
로그인 후 복사
로그인 후 복사
    younglady.Introduce(); <span class="rem">//Introduce</span>
로그인 후 복사

        image

      普通公共成员的创建,不在类的里面来编码,而是通过类的prototype来创建。添加普通公共成员都直接添加到类的prototype中,而prototype就是一个像JSON对象一样的成员集对象。当我们进行对象创建时,可以认为会将类prototype中的成员整体copy入新的Object对象中。

    <span class="kwrd">var</span> younglady = <span class="kwrd">new</span> Lady();
로그인 후 복사
로그인 후 복사
로그인 후 복사
    younglady.Introduce(); <span class="rem">//Introduce</span>
로그인 후 복사
 
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사
    Lady.prototype.Hobby = <span class="str">"上网"</span>;
로그인 후 복사
    Lady.prototype.GetName = <span class="kwrd">function</span>() {
로그인 후 복사
      <span class="kwrd">return</span> <span class="kwrd">this</span>.Name;
로그인 후 복사
    };
로그인 후 복사
로그인 후 복사
    
로그인 후 복사
    <span class="kwrd">var</span> lady2 = <span class="kwrd">new</span> Lady();
로그인 후 복사
    alert(lady2.GetName());
로그인 후 복사
    alert(lady2.Hobby);
로그인 후 복사

      上面代码通过prototype为Lady类添加了普通公共成员GetName方法和Hobby属性,因为是公共成员,所以它们可以和原先定意在类中的特权成员进行互相访问。因为公共成员可以互相访问。对上述代码做些修改。如下。

    <span class="kwrd">var</span> younglady = <span class="kwrd">new</span> Lady();
로그인 후 복사
로그인 후 복사
로그인 후 복사
 
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사
    Lady.prototype.Hobby = <span class="str">"上网"</span>;
로그인 후 복사
    Lady.prototype.GetName = <span class="kwrd">function</span>() {
로그인 후 복사
      <span class="kwrd">return</span> <span class="kwrd">this</span>.Name;
로그인 후 복사
    };
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사
 
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사
    alert(younglady.GetName());
로그인 후 복사
로그인 후 복사
    alert(younglady.Hobby);
로그인 후 복사
로그인 후 복사

      先创建出Lady对象,再修改类成员,先前创建好的对象也具有了新的成员。这就是prototype做为类原型所带来的好处,这里简单理解,可以认为prototype是类对象的模版,模版的修改会影响到所有该类对象。

      在添加普通成员的时候也可以来个批量的添加,直接用一个新的JSON对象来赋给prototype就可以了。但是要注意,现在是将原先的prototype进行了替换,在替换之前创建的对象引用的是旧的prototype对象,所以对prototype替换之前创建的对象不会有Hobby和GetName成员。

    Lady.prototype = {
로그인 후 복사
      Hobby: <span class="str">"上网"</span>,
로그인 후 복사
      GetName: <span class="kwrd">function</span>() {
로그인 후 복사
        <span class="kwrd">return</span> <span class="kwrd">this</span>.Name;
로그인 후 복사
      }
로그인 후 복사
    };
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사
    <span class="kwrd">var</span> younglady = <span class="kwrd">new</span> Lady();
로그인 후 복사
로그인 후 복사
로그인 후 복사
    alert(younglady.GetName());
로그인 후 복사
로그인 후 복사
    alert(younglady.Hobby);
로그인 후 복사
로그인 후 복사

      除了在构建类时可以添加公共成员,还可以对对象直接进行成员操作。这在本小系列第二篇文章里有描述。这里做一下补充,对对象直接添加的成员,也是一种公共成员,这些成员也可以和类中原先具有的公共成员进行访问。

    younglady.SetName = <span class="kwrd">function</span>(name) {
로그인 후 복사
      <span class="kwrd">this</span>.Name = name;
로그인 후 복사
    };
로그인 후 복사
로그인 후 복사
    younglady.SetName(<span class="str">"菜明"</span>);
로그인 후 복사
    alert(younglady.GetName());
로그인 후 복사

以上说了一下类成员的东西,下次再说说类继承相关的东西。(如有不当说法请指正)

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
최신 이슈
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿