zoukankan      html  css  js  c++  java
  • javascript面向对象程序设计


           在学习js面向对象编程之前,首先须要知道什么是面向对象。面向对象语言都有类的概念,通过它能够创建具有同样属性和方法的对象。但js并没有类的概念,因此js中的对象和其它语言的对象有所不同。

           js对象能够定义为:”无需属性的集合,其属性能够是基本值、对象和函数。每一个对象都是基于一个引用类型创建的。

           js创建对象有下面两种方法:

           1、创建一个Object实例:

            

    var person = new Object();

           2、使用对象字面量:

          

     var person ={};

          3、工厂模式:

        

      function createPerson(name,age,job){
          var p = new Object();
         p.name=name;
         p.age=age;
         p.job=job;
        return p;
        }
       var p1=createPerson("jack",22,“front-end Engineer");
      var p2=.....;

        4.构造函数模式:

        

     function Person(name,age,job){
         this.name=name;
         this.age=age;
        this.job=job;
         this.sayName=function(){alert(this.name);};
         }
        var p1= new Person("jack",22,"front-end Engineer");
       var p2=...;

       这里暂停一下,由于构造函数模式比較重要,这里解释一下:这里实际上是经历了下面4个步骤:

        (1)创建一个对象;

         (2)将构造函数作用域赋给这个对象(所以this将指向这个新创建的对象)

        (3)运行里面的代码,为新对象加入属性;

        (4)返回新对象;

         上面创建的p1和p2都有一个constructor的属性,它指向Person。而且p1和p2即使Person的实例,同一时候也是Object的实例,由于全部对象都继承自Object。

         缺陷:每一个方法都要在实例上又一次创建一遍,js中的函数是对象,因此能够将函数转移到构造函数的外部:

        

     function Person(name,age,job){
               this.name=name;
              this.age=age;
              this.job=job;
              this.sayName=sayName;
        }
         fucntion sayName(){
            alert("this.name");
       }
          var p1=.....;
          var p2=....;

         5.原形模式:

         我们创建的函数都有一个prototype属性,它是一个指向一个对象的指针。


         6.抽象函数:

          

    Object.extend=function(destination,source){
    	for(property in source){
    		destination[property]=source[property];
    	}
    	return destination;
    }
    //定义一个抽象基类base,无构造函数
    function base(){};
    
    base.prototype={
        initialize:function(){
        	this.oninit();//调用了一个虚方法
        }
    }
    function SubClassA(){
    	//构造函数
    }
    SubClassA.prototype=Object.extend({
    	propInSubClassA:"propInSubClassA",
    	oninit:function(){
    		alert(this.propInSubClassA);
    	}
    },base.prototype);
    
    function SubClassB(){
    	//构造函数
    }
    SubClassB.prototype=Object.extend({
    	propInSubClassB:"propInSubClassB",
    	oninit:function(){
    		alert(this.propInSubClassB);
    	}
    },base.prototype);
    
    var objA=new SubClassA();
    objA.initialize();//输出"propInSubClassA"
    
    var objB=new SubClassB();
    objB.initialize();//输出"propInSubClassB"

  • 相关阅读:
    计算机网络(1)----概述
    博客园自定义样式
    linux进程
    接口回调解析
    优先级队列
    双栈实现队列
    递归解决反转链表的一部分
    Multisim 之逻辑转换仪
    Multisim 如何添加文本 如何编辑文本字体
    Multisim 中的一些快捷键
  • 原文地址:https://www.cnblogs.com/bhlsheji/p/4302579.html
Copyright © 2011-2022 走看看