好程序员前端学习路线分享模拟JavaScript中面向对象技术

好程序员前端学习路线分享模拟JavaScript中面向对象技术,在C#和Java语言中,面向对象是以类的方式实现的,特别是继承这个特性,类的方式继承表现出了强大的功能,而且也易于学习。JavaScript不是纯的面向对象的语言,而是基于对象的语言,对象的继承是以原型函数的形式继承的,很多初学者刚开始接触的时候不太理解,但是JavaScript这种以原型函数的形式实现面向对象技术,不仅是可行的,而且还为面向对象技术提供了动态继承的功能,本文主要讨论了JavaScript的面向对象技术。?
一、原型对象概述?
  每个JavaScript对象都有原型对象,对象都继承原型对象的所有属性。一个对象的原型是由创建该对象的构造函数定义的。JavaScript的所有函数都有一个名为prototype的属性,该属性引用了原型对象,该原型对象初始化的时候只有constructor属性来引用创建该原型对象的对象。JavaScript没有Class定义类的概念,构造函数就定义了类,并初始化类中的属性,每个类的成员都会从原型对象中继承相同的属性,也就是说,原型对象提供了类的实例共享的属性和方法,这就节约了内存。?
  当读取一个对象的属性的时候,JavaScript会先从对象中查找,如果没有查找到,才会到原型对象中查找该属性(或方法),所以,尤其是对于方法,最好保存到原型对象中以便于共享,并且达到节省内存的目的,而且原型对象还有一个强大的功能,那就是如果通过构造函数实例化一些对象后,再给构造函数的原型对象增加属性和方法,那么它原来实例化的对象实例将会继承这些增加的属性和方法。?
二、对象属性、对象方法、类属性、类方法?
  每个对象都会有自己单独的实例属性和实例方法的副本,如果实例化5个对象,那么就会有5个对象的实例属性和实例方法副本。This关键字引用它们的实例对象,也就是说,谁操作了实例方法,this就引用谁;访问了哪个实例对象的属性,this就引用这个实例对象。?
  类方法和类属性只有一个副本,类方法调用的时候必须引用类的名字,例如:Date.setHours();?
  下面用一个程序来表现实例属性、实例方法、类属性、类方法?

 function?Mobile(kind,brand)?{?
  ????this.kind=kind;//定义手机的种类,例如GSM/CDMA?
  ????this.brand=brand;//定义手机的品牌,this关键字表示用该构造函数实例化之后的对象?
  }?
  ?
  ///?
  ?定义类的第二步是在构造函数的原型对象中定义它的实例方法或其他属性?
  ?该对象定义的任何属性都将这个类的所有实例继承。?
  ??
  ?
/?
  ?//拨号,这里只是返回电话号码?
  Mobile.prototype.dial?=?function(phoneNo)?{?
  ????return?phoneNo;?
  };?
  ?
  ?
  /
//?
  ?定义类的第三步是定义类方法,常量和其他必要的类属性,作为构造函数自身的属性,而不是构造函数?
  ?原型对象的属性,注意,类方法没有使用关键字this,因为他们只对他们的实际参数进行操作。?
  ?
/?
  //开机关机方法?
  Mobile.turnOn=function()?{?
  ???return?"The?power?of?mobile?is?on";?
  }?
  Mobile.turnOff=function()?{?
  ???return?"The?power?of?mobile?is?off";?
  }?

 
  //类属性,这样他们就可以被用作常量,注意实际上他们并不是只读的?
  Mobile.screenColor=64K;//假设该类手机的屏幕颜色都是64K彩屏的?
三、子类化?
???JavaScript支持子类化,只需把子类的原型对象用超类实例化即可,但是应该注意,这样子类化之后就会存在一个问题,由于是用超类实例化子类的原型对象取得的,所以就冲掉了自己本身的由JavaScript提供的constructor属性,为了确保constructor的正确性,需要重新指定一下,子类化的程序例子如下:?
???/??子类化??/?
//下面是子类构造函数智能型手机?
function?SmartPhone(os)?
{?
??this.os=os;?

}?
//我们将Mobile对象作为它的原型?
//这意味着新类的实例将继承SmartPhone.prototype,?
//后者由Mobile.prototype继承而来?
//Mobile.prototype又由Object.prototype继承而来?
SmartPhone.prototype=new?Mobile(GSM,Nokia);?
//下面给子类添加一个新方法,发送电子邮件,这里只是返回Email地址?
SmartPhone.prototype.sendEmail=function(emailAddress)?{?
??return?this.emailAddress?
}?
//上面的子类化方法有一点缺陷,由于我们明确把SmartPhone.prototype设成了我们所创建的一个对象,所以就覆盖了JS提供?
//的原型对象,而且丢弃了给定的Constructor属性。该属性引用的是创建这个对象的构造函数。但是SmartPhone对象集成了它的?
//父类的constructor,它自己没有这个属性,明确设置着一个属性可以解决这个问题:?
SmartPhone.prototype.constructor=SmartPhone;?
var?objSmartPhone=new?SmartPhone();//实例化子类

原文地址:https://blog.51cto.com/14479068/2433691

时间: 2024-10-10 00:55:25

好程序员前端学习路线分享模拟JavaScript中面向对象技术的相关文章

好程序员Java学习路线分享SpringCloud

好程序员Java学习路线分享SpringCloud一.Web应用架构的演变随着互联网的发展,网站应用的规模不断扩大,Web应用架构也在不断的演变四个阶段:单一应用.垂直应用.分布式服务.流动计算1.单一应用架构当网站访问量很小时,只需要一个应用程序,将所有的功能都部署在一起,以减少部署节点和成本 此时关键问题:简化数据库操作,数据访问框架ORM是核心适用场景:小型网站.管理系统.简易办公系统 局限:1.扩展性差2.不便于协同开发3.不利于升级维护 2.垂直应用架构 当访问量逐渐增大,单一应用(单

好程序员Java学习路线分享JVM类加载机制

好程序员Java学习路线分享JVM类加载机制,JVM相关概念 jdk<br>jdk(Java Development Kit)Java开发包,是Java开发人员用于编译和调试程序的一套程序的集合. jre<br>jre(Java Runtime Evironment)Java运行时环境,是运行Java程序的平台,所有的Java程序必须在这个平台中才能执行. jvm<br>jvm(Java Virtual Machine)Java虚拟机,是用代码虚拟出来的计算机,模拟执行

好程序员web前端学习路线之在JavaScript中使用getters和setter

好程序员web前端学习路线之在JavaScript中使用getters和setter,大多数面向对象的编程语言都存在getter和setter,包括JavaScript.它们是代码构造,可帮助开发人员以安全的方式访问对象的属性.使用getter,您可以从外部代码访问("获取")属性的值,而setter允许您更改("设置")它们的值.我们将向您展示如何在JavaScript中创建getter和setter. JavaScript对象可以具有多个属性和存储的静态数据和动

好程序员Java学习路线分享5分钟了解基数排序

好程序员Java学习路线分享5分钟了解基数排序,前言:基数排序无需进行比较和交换,而是利用分配和收集两种基本操作实现排序.基数排序分为两种:第一种是LSD ,从最低位开始排序:第二种是 MSD, 从最高位开始排序. 基数排序思想介绍 分配:对于数字,每位的取值范围是0-9,因此需要10个容器(我们可以将其称为桶),这10个桶标号为0-9.每趟排序时,我们取每一个元素在该位的数值依次放入桶中. 收集:在一趟排序完成后,我们按顺序从0-9的桶中依次取元素. 继续进行分配和收集,直到最大位数排序完成.

好程序员Java学习路线分享冒泡排序及优化

? 好程序员Java学习路线分享冒泡排序及优化,冒泡排序是一定典型的交换排序,如排序规则是升序,有如下数列: ? A[0] A[1] A[2] A[3] ...... A[n] ? 将A[0]和A[1]比较,如果A[0]>A[1] ,则交换两个元素的位置,否则不变, 再继续比较A[1]和A[2],直到A[n-1]和A[n].即比较相邻的两个元素,如果前一个大,就交换(否则不交换),再继续比较后面的元素,每一轮比较之后,最大的元素会移动到最后(完成一轮冒泡):再开始第二轮冒泡,本次会选出第二大的元

好程序员Java学习路线分享创建Java class

好程序员Java学习路线分享创建Java class,首先通过Transport Client获取ES的连接 private Client client; //通过Transport Client获取ES的连接 @Before public void getClient() throws Exception{ ????//ES服务的JavaAPI的port为9300 ????//注意:如果请求一个ES集群,可以多添几个节点 ????//为了避免在一个节点出现网络问题导致的请求失败问题,可以自动切

好程序员Java学习路线分享JDBC初体验

好程序员Java学习路线分享JDBC初体验,JDBC(Java DataBase Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成.JDBC提供了一种基准,据此可以构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序 -?Java 具有坚固.安全.易于使用.易于理解和可从网络上自动下载等特性,是编写数据库应用程序的杰出语言.所需要的只是 Java应用程序与各种不同数据库之

好程序员Java学习路线分享JS中的面向对象

好程序员Java学习路线分享JS中的面向对象,在JS中,一般情况下我们都是直接写函数,直接调用,但是发现JS中也有new关键字,那么new关键字作为创建对象的关键字,给我们的感觉就是在JS中可以定义一个类,然后用new创建对象,那么在JS中如何做呢?我们先看如下案例,下面的案例是写一个简单的喷泉效果的. window.onload = function(){ // 创建一个画布对象var canvas = document.createElement("canvas");// 设置大小

好程序员Java学习路线分享Java面试题之加载机制

好程序员Java学习路线分享Java面试题之加载机制,面试场景:面试官第一问:请问,我现在编写一个类,类全名如下:java.lang.String,我们知道JDK也给我们听过了一个java.lang.String,那么,我们编写的这个String类能否替换到JDK默认提供,也就是说程序实际运行的时候,会加载我们的String还是JDK的String?为什么?如果,你无法确定?那么第二问:了解类的加载机制吗?知道JDK的类加载器吗?双亲委托机制说说看如果,你还不了解,那么我们聊聊今天的天气吧!1,