JS三大特性
抽象
在分析三大特性之前我们要先了解什么叫抽象。
定义:
在定义一个类的时候,实际上就是把一类事物的共有的属性和行为提取出来,形成一个物理模型(模板),这种研究问题的方法就称为抽象
一、封装
定义:
就是把抽象出来的属性和对属性的操作封装在一起,属性被保护在内部,程序的其他部分只能通过特定的操作(函数),才能对属性进行操作。
公开属性和私有属性
<script>
function Person(in_name, in_age, in_sql) {
this.name = in_name;
var age = in_age;
var sql = in_sql;
}
var p1 = new Person("haha", 20, 1000)
alert(p1.name)
</script>
结果:

但是此时我们访问,age和sql:
<script>
function Person(in_name, in_age, in_sql) {
this.name = in_name;
var age = in_age;
var sql = in_sql;
}
var p1 = new Person("haha", 20, 1000)
alert(p1.age)
</script>
结果:

说明:
这里我们就看到了name是公开属性,而age和sql则是私有属性。
问题:属性有公开属性和私有属性,那方法有没私有和公开之分那?
类中的公开方法有个别名特权方法,私有方法有个别名内部方法。
公开方法
<script>
function Person(in_name, in_age, in_sql) {
this.name = in_name; // 公开属性
var age = in_age; // 私有属性
var sql = in_sql; // 私有属性
// 在类中如何定义公开方法(特权方法);私有方法(内部方法)
// 如果我们希望操作私有的属性,则可用公开方法实现
this.show = function () {
alert(age + "" + sql)
}
}
var p1 = new Person("haha", 20, 1000)
p1.show();
</script>
公开方法
结果:

说明:
外部要想操作私有属性,可以通过公开方法来实现
私有方法
<script>
function Person(in_name, in_age, in_sql) {
this.name = in_name; // 公开属性
var age = in_age; // 私有属性
var sql = in_sql; // 私有属性
// 私有方法
function show2() {
alert(age + ' ' + sql)
}
}
var p1 = new Person("haha", 20, 1000)
p1.show2(); // 这样调用会报错!
</script>
私有方法
说明:
私有方法同样可以使用同 类 中的私有属性,但是私有方法在外部却无法被操作。
上面的方法,在每次实例化对象的时候,会为每个对象生成一次,即每个对象中都有一个类似的方法,在一定程度上会造成资源浪费。
原型对象 prototype
因此我们想到 原型对象(prototype) 在类的基础上添加方法,间接的效果也让让每个对象也具有这个方法,这样操作只让方法在类中存一份,不会在每个对象中储存。
但是这个样处理,也有小问题;即不能调用私有变量和私有方法。
定义的方法操作公有属性:
<script>
function Person() {
this.name = "abc";
var age = 90;
}
Person.prototype.fun1 = function() {
alert(this.name);
}
var p1 = new Person();
p1.fun1(); // 结果:弹出abc
</script>
公有属性
定义的方法操作私有属性:
<script>
function Person() {
this.name = "abc";
var age = 90;
}
Person.prototype.fun1 = function() {
alert(age);
}
var p1 = new Person();
p1.fun1(); // 结果:报错 age is not defined(…)
</script>
私有属性
操作私有方法和公有方法:
<script>
function Person() {
this.name = "abc"; // 公有属性
var age = 90; // 私有属性
// 共有方法
this.show1 = function() {
alert("haha")
}
// 私有方法
function show2() {
alert("xxx")
}
}
Person.prototype.fun1 = function() {
this.show1(); // 正确
show2(); // 报错
}
var p1 = new Person();
p1.fun1();
</script>
操作方法
二、继承
问题:为什么需要继承?
最直接的回答,解决代码冗余。
需求:学生交学费,中学生打8折;小学生打5折,然后通过打印的方法,显示学生的名字、年龄记应缴学费。
我们初步的代码:
<script>
// 中学生
function MidStu(name,age) {
this.name = name;
this.age = age;
this.show = function() {
alert(this.name + ' ' + this.age);
} // 计算学费
this.payFee = function(mon) {
alert("应缴" + mon*0.8);
}
} // 小学生
function PupStu(name,age) {
this.name = name;
this.age = age;
this.show = function() {
alert(this.name + ' ' + this.age);
} // 计算学费
this.payFee = function(mon) {
alert("应缴" + mon*0.5);
}
} </script>
可以看出两个类型学生代码中有很多相同的代码,出现了代码冗余的问题。
问题:怎么解决上面的代码冗余?
抽象出一个学生类(即,把两类学生共性取出来形成的类);然后通过继承的方式处理。
<script>
// 抽象出两类学生共性的类
function Stu(name, age) {
this.name = name;
this.age = age;
this.show = function() {
alert(this.name + ' ' + this.age);
}
} // 中学生
function MidStu(name,age) {
// js实际上是通过对象冒充来实现继承的。
this.stu = Stu;
this.stu(name, age); // 这段代码很重要,如果没有它则继承就失败了 // 计算学费
this.payFee = function(mon) {
alert("应缴" + mon*0.8);
}
} // 小学生
function PupStu(name,age) {
this.stu = Stu;
this.stu(name, age); // 计算学费
this.payFee = function(mon) {
alert("应缴" + mon*0.5);
}
} // 测试继承
var midStu = new MidStu("haha", 30);
midStu.show(); </script>
继承
结果:

结果我们发现,我们的MidStu中并没show方法,但是我们结果却能调用。
说明:
js的继承实际上是通过对象冒充来实现的。
js对象继承的关键点:
- this.stu = Stu;这里相当于将整个Stu函数赋值给stu;赋值的是内存中的索引。此时如果alert(this.stu)的话;会将Stu的整个函数打印出来。

- this.stu(‘xxx’, 20):这段代码相当重要,关乎继承能否成功,前面我们知道,第一步只是接收了Stu的内存中的索引,这步的执行,就相当于将Stu的属性和方法,具体的赋给MidStu。
总结:
1、这里体现了js是动态语言的特性,在执行的过程中开辟内存空间。
2、js的继承是通过对象冒充来完成的。
3、js可以实现多重继承,虽然很少用,但是它具备这个功能。
4、Object类是js所有类的基类。
多态
定义:
指一个引用(类型)在不同情况下的多种状态。
js实际上是舞台的,是一种动态语言,一个变量的类型是在运行的过程中有js引擎来决定的,所以,也可以说js天生就支持多态。
典型案例:
<script>
function Person() {
this.test = function() {
alert("Person");
}
}
function Dog() {
this.test = function() {
alert("Dog");
}
}
var v = new Person();
alert(v.constructor);
v = new Dog();
alert(v.constructor);
</script>
多态
通过打印对象的构造函数来判断对象的类型。v会随着对象的创建,而变化类型。
JS三大特性的更多相关文章
- Fis3的前端工程化之路[三大特性篇之声明依赖]
Fis3版本:v3.4.22 Fis3的三大特性 资源定位:获取任何开发中所使用资源的线上路径 内容嵌入:把一个文件的内容(文本)或者base64编码(图片)嵌入到另一个文件中 依赖声明:在一个文本文 ...
- Fis3的前端工程化之路[三大特性篇之资源定位]
Fis3版本:v3.4.22 Fis3的三大特性 资源定位:获取任何开发中所使用资源的线上路径 内容嵌入:把一个文件的内容(文本)或者base64编码(图片)嵌入到另一个文件中 依赖声明:在一个文本文 ...
- Fis3的前端工程化之路[三大特性篇之内容嵌入]
Fis3版本:v3.4.22 Fis3的三大特性 资源定位:获取任何开发中所使用资源的线上路径 内容嵌入:把一个文件的内容(文本)或者base64编码(图片)嵌入到另一个文件中 依赖声明:在一个文本文 ...
- JavaScript基础--面向对象三大特性(八):继承封装多态
一.构造函数基本用法:function 类名(参数列表){ 属性=参数值} function Person(name,age){ this.name = name; this.age = age; } ...
- 面向对象编程(九)——面向对象三大特性之继承以及重写、Object类的介绍
面向对象三大特性 面向对象三大特征:继承 :封装/隐藏 :多态(为了适应需求的多种变化,使代码变得更加通用!) 封装:主要实现了隐藏细节,对用户提供访问接口,无需关心方法的具体实现. 继承:很好的实现 ...
- 前端基础-CSS的各种选择器的特点以及CSS的三大特性
一. 基本选择器 二. 后代选择器.子元素选择器 三. 兄弟选择器 四. 交集选择器与并集选择器 五. 序列选择器 六. 属性选择器 七. 伪类选择器 八. 伪元素选择器 九. CSS三大特性 一. ...
- JavaScript面向对象的三大特性
1.JavaScript面向对象的三大特性 JavaScript的三大特性:封装性.继承性.多态性. 2.JavaScript实现封装特性 在一些静态类型的语言如java中,本身语法就提供了这些功能. ...
- Javascript面向对象三大特性(封装性、继承性、多态性)详解及创建对象的各种方法
Javascript基于对象的三大特征和C++,Java面向对象的三大特征一样,都是封装(encapsulation).继承(inheritance )和多态(polymorphism ).只不过实现 ...
- CSS三大特性(继承、优先级、层叠)之个人见解
首先声明一下CSS三大特性——继承.优先级和层叠.继承即子类元素继承父类的样式,比如font-size,font-weight等f开头的css样式以及text-align,text-indent等t开 ...
随机推荐
- K60——寄存器
(1)PTx_BASE_PTR为GPIO寄存器结构体基址指针(PTR即point to register,x=A/B/C/D/E) /* GPIO - Peripheral instance base ...
- 【大前端之打通账号系统】passport应该如何落地?
前言 之前接入百度账号系统的时候写了一篇博客做研究:[大前端]认识单点登录,出来后才发现,很多小公司其实并没有将账号系统打通,总结一下账号系统没通的原因是: ① 最初设计就没想过身份认证应该做整合 ② ...
- HTML5本地存储Localstorage
什么是localstorage 前几天在老项目中发现有对cookie的操作觉得很奇怪,咨询下来是要缓存一些信息,以避免在URL上面传递参数,但没有考虑过cookie会带来什么问题: ① cookie大 ...
- html5 canvas首屏自适应背景动画循环效果代码
模板描述:html5 canvas首屏自适应背景动画循环效果代码 由于动态图太大,怕以后服务器受不了,所以现在都改为静态图了,大家点击演示地址一样的,希望大家喜欢,你们的支持就是小海的动力!! 欢迎大 ...
- React Native之 Navigator与NavigatorIOS使用
前言 学习本系列内容需要具备一定 HTML 开发基础,没有基础的朋友可以先转至 HTML快速入门(一) 学习 本人接触 React Native 时间并不是特别长,所以对其中的内容和性质了解可能会有所 ...
- iOS开发--Swift RAC响应式编程初探
时间不是很充足, 先少说点, RAC的好处是响应式编程, 不需要自己去设置代理委托, target, 而是主要以信息流(signal), block为主, 看到这里激动吧, 它可以帮你监听你的事件, ...
- 纯Swift编写的仿“随遇”应用源码
纯Swift编写的仿“随遇”App概述 此项目是为了巩固Swift掌握而编写的,素材均来自“随遇”官方App 用Storyboard+Xib+Autolayout的方式来实现UI部分 由于项目不复杂, ...
- [Erlang 0125] Know a little Erlang opcode
Erlang源代码编译为beam文件,代码要经过一系列的过程(见下面的简图),Core Erlang之前已经简单介绍过了Core Erlang,代码转换为Core Erlang,就容易拨开一些语法糖的 ...
- ORACLE分区表梳理系列(一)- 分区表概述、分类、使用方法及注意事项
版权声明:本文发布于http://www.cnblogs.com/yumiko/,版权由Yumiko_sunny所有,欢迎转载.转载时,请在文章明显位置注明原文链接.若在未经作者同意的情况下,将本文内 ...
- $(window).height(),在火狐下面获取的高度并不是可视区域的高度
很简单,我发现是没有写<!DOCTYPE html>造成的,加上去就可以了