zoukankan      html  css  js  c++  java
  • JavaScript -- 面向对象

    概述

      JavaScript本身并非面向对象(不支持“class”关键字),只能通过其本身的一些特性来模拟面向对象编程。

      主要分为两大类:

        1,原始对象方式;

        2,构造函数方式(推荐)。

    原始对象方式

      直接使用json:

    		var Dog = {
    			name : '';
    			color : ''
    		};
    
    		var dog1 = {};
    		dog1.name = "dog1";
    		dog1.color = "yellow";
    
    		var dog2 = {};
    		dog2.name = "dog2";
    		dog2.color = "blue";
    

      这类方式有2个缺点:1,原型与实例对象之间关系不明显(dog1与dog2很难看出是Dog的实例);2,语法非常啰嗦。

      为了解决语法啰嗦的问题,可以使用以下方式:

    		function Dog(name, color) {
    			return {
    				name : name,
    				color : color
    			}
    		}
    
    		var dog1 = Dog("dog1", 'yellow');
    		var dog2 = Dog("dog2", "blue");
    

      此类方式仍旧存在缺点1。

    构造函数方式

      原型对象方式存在以上的问题,JavaScript提供构造器方式。

      构造器:形式上仍是一个function,但其内部含有this关键字,可以使用new 关键字调用构造器生成实例。

      使用构造器修改之前的代码:

    		function Dog(name, color) {
    			this.name = name;
    			this.color = color;
    		}
    		Dog.prototype.eat = function (){
    			alert("eat something");
    		};
    		Dog.prototype.type = "dog";
    
    		var dog1 = new Dog("dog1", "yellow");
    		var dog2 = new Dog("dog2", "blue");
    

     

      这里要说明的是prototype关键字,以上代码中

    		Dog.prototype.eat = function (){
    			alert("eat something");
    		};
    		Dog.prototype.type = "dog";
    

      

      可以使用this关键字代替:

        this.type = "dog";
    
        this.eat = function(){alert(“eat something");};
    

      

        但是this关键字方式存在一个问题:每个实例都会重新生成type及eat,但我们看到,对于type及eat每个实例的内容都是一样的,所以这样就造成了内存的浪费。

      有没有方式可以解决这个问题呢?有,那就是使用prototype关键字。

        prototype关键字:每个构造器都可以使用prototype,它指向另一个对象,此对象的属性和方法会被该构造器的实例继承。

      总结:
         1,原型对象方式可能存在”原型与实例对象之间关系不明显“、”语法啰嗦“的问题;

       2,构造器方式是推荐的方式,使用this关键字声明属性和方法,new关键字生成实例化对象;

       3,若构造器方式中含有一致的方法或属性,可以使用prototype关键字节约内存。

      

  • 相关阅读:
    [设计模式]在CodeDom代码生成中使用Decorator模式实现类型创建
    【翻译】防腐层:面向领域驱动设计的更为稳健的系统集成方案
    EntityFramework之领域驱动设计实践【后续篇】:基于EF 4.3.1 Code First的领域驱动设计实践案例
    Apworks框架中各种仓储实现的性能基准测试与结果对比
    CQRS架构中同步服务的一种实现方式
    在Visual Studio 2010中创建多项目(解决方案)模板【三】
    Microsoft NLayerApp案例理论与实践 应用层
    在Visual Studio 2010中创建多项目(解决方案)模板【二】
    小猫奥斯卡
    测试一下又拍网图片外链
  • 原文地址:https://www.cnblogs.com/forstudy/p/3393871.html
Copyright © 2011-2022 走看看