JavaScript学习总结(九)——Javascript面向(基于)对象编程

转载自  JavaScript学习总结(九)——Javascript面向(基于)对象编程

一、澄清概念

  1.JS中"基于对象=面向对象"

  2.JS中没有类(Class),但是它取了一个新的名字叫“原型对象”,因此"类=原型对象"

二、类(原型对象)和对象(实例)的区别与联系

  1.类(原型对象)是抽象,是概念的,代表一类事物。

  2.对象是具体的,实际的,代表一个具体的事物。

  3.类(原型对象)是对象实例的模板,对象实例是类的一个个体。

三、抽象的定义

  在定义一个类时,实际上就是把一类事物的共有属性和行为提取出来,形成一个物理模型(模板),这种研究问题的方法称为抽象。

四、JavaScript面向对象三大特征

  4.1.封装

  封装就是把抽象出来的属性和对属性的操作封装在一起,属性被保护在内部,程序的其它部分只有通过被授权的操作(函数),才能对属性进行操作!

封装的范例:

<script type="text/javascript">/*定义一个Person类*/function Person(_name,_age,_salary){//Person类的公开属性,类的公开属性的定义方式是:”this.属性名“this.Name=_name;//Person类的私有属性,类的私有属性的定义方式是:”var 属性名“var Age=_age;var Salary=_salary;//定义Person类的公开方法(特权方法),类的公开方法的定义方式是:”this.functionName=function(){.....}“this.Show=function(){alert("Age="+Age+"\t"+"Salary="+Salary);//在公开方法里面访问类的私有属性是允许的}/*定义Person类的私有方法(内部方法),类的私有方法的定义方式是:”function functionName(){.....}“,或者 var functionName=function(){....}*/function privateFn(){alert("我是Person类的私有函数privateFn");}var privateFn2=function(){alert("我是Person类的私有函数privateFn2");}}/*通过prototype给可以类的所有对象添加公共(public)方法,但是这种方式定义的方法不能去访问类的私有属性和私有方法*/Person.prototype.Fn=function(){alert("访问公共属性this.Name="+this.Name);//访问公共属性,OK的//alert("访问私有属性Aag="+Age);//访问私有属性,这里会报错“Age未定义”//privateFn();//调用私有方法,这里会报错“缺少对象”}var p1 = new Person("孤傲苍狼",24,2300);alert("p1.Name="+p1.Name);//访问公有属性,这是可以正常访问的alert("p1.Age="+p1.Age+"\t"+"p1.Salary="+p1.Salary);//不能使用类的对象去直接访问类私有属性,这是访问不了的,结果都是undefinedp1.Show();//调用类的公共函数,这次允许的p1.Fn();//调用类的公共函数,这次允许的//alert("p1.privateFn():"+p1.privateFn()+"&nbsp;p1.privateFn2():"+p1.privateFn2());//不能使用类的对象去调用类的私有方法,这里会报错”对象不支持此属性或者方法“</script>

 4.2.继承

继承范例:

<script type="text/javascript">/*定义Stu类*/function Stu(name,age){this.Name=name;this.Age=age;this.Show=function(){window.alert("我的名字是:"+this.Name+",今年:"+this.Age);}this.SayHello = function(){window.alert("Hello,"+this.Name);}}/*定义MidStu类*/function MidStu(name,age){this.stu=Stu;//MidStu类继承Stu类this.stu(name,age);//JS中实际上是通过对象冒充来实现继承的,这句话不能少,因为JS是动态语言,如果不执行,则不能实现继承效果/*从父类继承下来的公共方法,可以根据实际情况选择重写*///在子类MidStu中重写父类Stu的Show方法/*this.Show=function(){alert("MidStu.Show()");}*///在子类MidStu中重写父类Stu的SayHello方法this.SayHello=function(){alert("你好,"+this.Name);}}var midStu = new MidStu("孤傲苍狼",24);//创建一个MidStu类实例对象alert("访问继承下来的属性Name和Age,midStu.Name="+midStu.Name+",midStu.Name="+midStu.Age);//访问继承下来的属性midStu.Show();//调用从父类Stu继承下来的Show方法midStu.SayHello();//调用从父类Stu继承下来的SayHello方法,SayHello()在子类中进行了重写,这里调用的是重写过后的SayHello()方法</script>

运行结果:

 4.3.多态

  所谓多态,就是指一个引用在不同情况下的多种状态,在Java中多态是指通过指向父类的引用,来调用不同子类中实现的方法。

  JS实际上是无态的,是一种动态语言,一个变量的类型是在运行过程中由JS引擎决定的,所以说,JS天然支持多态。

五、JavaScript自定义类(原型对象)的方式

  5.1.工厂方法——使用new Object创建对象并添加相关属性

    //通过Object直接创建对象//var p1 = new Object();//创建一个Object对象var p1 = {};//创建一个Object对象,简写//动态增加属性、方法p1.Name = "孤傲苍狼";p1.Age = 24;p1.SayHello = function() { alert("hello,"+p1.Name); };p1.SayHello();  for(var propertyName in p1) {//对象的成员都是对象的keyalert(propertyName);}

  5.2.使用构造函数来定义类(原型对象)

基本语法:
function 类名(){this.属性名;//公共属性var 属性名;//私有属性/*凡是定义类的公共属性和公共方法都要使用this*///定义类的公共函数this.函数名=function(){}//定义类的私有函数function 函数名(){}
}

范例:

/*定义一个猫类,这种就是使用构造函数来定义类(原型对象)*/function Cat(){this.Name="catName";//public属性this.Age;//public属性this.Color;//public属性var weight=2;//private属性,只能在Cat类内部使用,Cat类的对象无法访问这个私有属性//public方法this.publicFunction = function(){alert(weight);alert("猫叫...");}//private方法,只能在Cat类内部使用,Cat类的对象无法访问这个私有方法var privateFunction = function(){alert("私有方法");}}//如果这样用,那么就当成函数来使用Cat();//如果这样用,那么就当成类来使用var cat1 = new Cat();//cat1就是一个对象(实例)alert(cat1.Name);//访问公共属性,弹出默认值catNamecat1.Name="TomCat";//访问公共属性cat1.Age=3;//访问公共属性cat1.Color="白色";//访问公共属性alert(cat1.weight);//访问私有属性,无法访问,弹出undefinedalert(cat1.Name+"\t"+cat1.Age+"\t"+cat1.Color);//访问对象的属性方式1:对象名.属性名alert(cat1["Name"]+"\t"+cat1["Age"]+"\t"+cat1["Color"]);//访问对象的属性方式2:对象名["属性名"]cat1.publicFunction();//调用public方法cat1.privateFunction();//调用private方法,报错:对象不支持此属性或方法for(var property in cat1){document.writeln(property+"\t");}

JS中一切都是对象,类(原型对象)其实也是对象,它实际上是Function类的一个实例

   document.write("<pre>");function Person(){}/*Person.constructor得到的Person类的构造函数如下:function Function() {[native code]}*/document.writeln("Person.constructor:"+Person.constructor);//Person类的构造函数document.writeln("Person:"+Person);var p1 = new Person();document.writeln("p1.constructor:"+p1.constructor);//”p1.constructor“是得到p1实例的构造函数//如何判断某个对象是不是某个类型,采用如下两种方式if(p1 instanceof Person){document.writeln("p1 is Person ok1");}if(p1.constructor==Person){document.writeln("p1 is Person ok2");}var num1=123;document.writeln("num1.constructor:"+num1.constructor);var str1="abc";document.writeln("str1.constructor:"+str1.constructor);document.write("</pre>")

运行结果:

Person.constructor:
function Function() {[native code]
}Person:function Person(){}
p1.constructor:function Person(){}
p1 is Person ok1
p1 is Person ok2
num1.constructor:
function Number() {[native code]
}str1.constructor:
function String() {[native code]
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/326746.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

将Springboot项目放在服务器上一直运行

nohup java -jar hz-sms-0.0.1-SNAPSHOT.jar >/www/wwwroot/...-0.0.1-SNAPSHOT.out 2>&1 &

迁移数据库到SQL on Linux Docker

问题引入 前一篇文章&#xff0c;菜鸟找到了SQL on Linux Docker容器销毁后&#xff0c;容器中的数据库文件可以得以保留的方法&#xff0c;老鸟非常开心。所以&#xff0c;今天又提出了新的问题&#xff1a;“鸟儿&#xff0c;如果我想把我的数据库从SQL on Windows迁移到SQL …

Spring IoC 容器

转载自 Spring IoC 容器 IoC 容器 Spring 容器是 Spring 框架的核心。容器将创建对象&#xff0c;把它们连接在一起&#xff0c;配置它们&#xff0c;并管理他们的整个生命周期从创建到销毁。Spring 容器使用依赖注入&#xff08;DI&#xff09;来管理组成一个应用程序的组…

字段缺失_区分Protobuf 3中缺失值和默认值

来自公众号&#xff1a;新世界杂货铺这两天翻了翻以前的项目&#xff0c;发现不同项目中关于Protobuf 3缺失值和默认值的区分居然有好几种实现。今天笔者冷饭新炒&#xff0c;结合项目中的实现以及切身经验共总结出如下六种方案。增加标识字段众所周知&#xff0c;在Go中数字类…

当初怎么就入了VS的坑

使用Turbo C和Turbo Pascal开始学习编程貌似也是一代人的集体记忆。这方面我也没什么忌讳&#xff0c;毕竟Borland Turbo C在九十年代末的PC上面还是一个运行效率不错的开发工具。然而启蒙老师的水平限制&#xff0c;那个时候所学习的编写和调试技术都不过关&#xff0c;一个超…

Mysql截取字段中 用逗号分割 省市县镇街道社区小区

Mysql截取字段中 用逗号分割 省市县镇街道社区小区 select id , name, substring_index(name,,,0) as province0, substring_index(name,,,1) as province1, substring_index(name,,,2) as province2, substring_index(name,,,3) as province3, substring_index(name,,,4) as…

如何导出Navicat的数据库连接配置

如何导出Navicat的数据库连接配置 如何导出Navicat的数据库连接配置_石头wang的博客-CSDN博客_navicat 导出配置 如何导出Navicat的数据库连接配置 背景 我们可能会在不同的电脑安装Navicat&#xff0c;这些连接的配置如何从一台电脑迁移到另外一条&#xff1f;自行备份是比较…

C#开发人员应该知道的13件事情

本文讲述了C#开发人员应该了解到的13件事情&#xff0c;希望对C#开发人员有所帮助。 1. 开发过程 开发过程是错误和缺陷开始的地方。使用工具可以帮助你在发布之后&#xff0c;解决掉一些问题。 编码标准 遵照编码标准可以编写出更多可维护的代码&#xff0c;特别是在由多个开发…

充电提示音_iPhone如何自定义充电提示音,图文教程

昨天给小伙伴们分享了几个iOS14的充电提示音和设置方法&#xff0c;不过有的小伙伴可能需要设置自己喜欢的声音为充电提示音&#xff0c;所以今天就来教大家自定义喜欢的iOS14充电提示音。教程由于比较仔细&#xff0c;看起来比较长&#xff0c;其实很简单&#xff0c;主要分为…

Scanner获取用户输入

next()和hasNext() public class Demo02_Scanner {public static void main(String[] args) {//创建一个扫描器对象&#xff0c;用于接收键盘数据Scanner scanner new Scanner(System.in);System.out.println("使用next方式接收: ");//判断用户有没有输入字符串if …

idea Lombok插件

此文提供对于Lombok的简单使用 1、Lombok简介 Lombok能通过注解的方式&#xff0c;在编译时自动为属性生成构造器、getter/setter、equals、hashcode、toString方法。 2、Lombok插件安装 想要使用 Lombok&#xff0c;必须要安装一个 Lombok 插件&#xff0c;不然编辑器无法识…

赫夫曼编码字节数组

思路分析 代码实现 package com.atguigu.huffmancode;import com.sun.org.glassfish.external.statistics.CountStatistic; import com.sun.org.glassfish.external.statistics.StringStatistic;import java.util.*;/*** 创建人 wdl* 创建时间 2021/3/27* 描述*/ public class…

.NET Core 工具中的新内容

Visual Studio 2017 RC最近一个版本更新包括一套更新的.NET Core工具箱。这个版本带来了几项改进&#xff0c;包括改变了模版化、dotnet网络命令&#xff0c;以及许多缺陷修复。微软的Rich Lander发表了一份更新说明&#xff0c;陈述了.NET Core开发人员可以预期在.NET Core RC…

你还可以续命几次?回顾DockPanel Suite项目的发展史

微软在设计Visual Studio.NET的时候汲取了之前IDE版本的各种教训&#xff0c;开始考虑怎样让开发人员能够快速调整多窗口的布局&#xff0c;灵活构建自己喜欢的日常界面。这种基于菜单条和悬浮面板的新界面也让Windows平台其他软件开发者豁然开朗&#xff0c;开始各种借鉴。微软…

利用赫夫曼编码进行数据解压

基本概念 代码实现 package com.atguigu.huffmancode;import com.sun.org.glassfish.external.statistics.CountStatistic; import com.sun.org.glassfish.external.statistics.StringStatistic;import java.security.AlgorithmConstraints; import java.util.*;/*** 创建人 w…

检测窥屏_开挂、狙击、窥屏?乱象丛生的炉石狂野天梯,到底怎么了?

今日正文1 中午吃饭时&#xff0c;我第二十三次诱惑牌酱跟我一起去狂野玩&#xff0c;在他第二十三次拒绝后&#xff0c;我问他为什么&#xff0c;他放下了筷子看着我&#xff0c;只说了一个字&#xff1a;“乱”乱&#xff1f;嗯&#xff0c;想想最近的狂野&#xff0c;不论是…

.NET Core log4net 使用

log4net .NET Core 版使用&#xff0c;log4net 2.0.7版发布也有一段时间了&#xff0c;从2.0.6 版开始就已经支持.NET Core。 之前有介绍NLog .NET Core版的使用&#xff0c;ASP.NET Core 开发-Logging 使用NLog 写日志文件。 ASP.NET Core已经内置了日志支持,可以轻松输出到控…

用赫夫曼树进行文件的压缩

思路分析 代码实现 package com.atguigu.huffmancode;import com.sun.org.glassfish.external.statistics.CountStatistic; import com.sun.org.glassfish.external.statistics.StringStatistic;import javax.xml.bind.SchemaOutputResolver; import java.io.*; import java.s…

.NET跨平台之旅:博问站点迁移至ASP.NET Core on Linux并发布上线

Powered by ASP.NET Core on Linux&#xff01; 我们全站的 .NET Core 迁移工作如火如荼&#xff0c;这是我们今年上半年的重要工作。 今天我们终于完成了博问产品&#xff08;q.cnblogs.com&#xff09;向 ASP.NET Core 的迁移&#xff0c;并已发布上线。如果您在博问页面的页…