js 之面向对象
对象 是什么?
对象就是一个整体,对外提供一些操作,比如:电视机(不用知道内部的构造,只知道怎么用)
面向对象 是什么?
使用对象时,只关注对象提供的功能,不关心内部细节,比如:操作电视机(只知道用遥控器控制)
JS的面向对象
特点:
1.抽象:抓住问题的核心
2.封装:不考虑内部细节,只考虑外部使用
3.继承:从已有的对象上,继承新的对象
·多重继承
·多态(少用)
对象的组成: | var cat = {
1.属性(变量) | cat.name = '小妮'; //属性
2.方法(函数) | cat.show= function(){ //方法
| alert('喵喵');
| }}
一、原始的对象
var cat1 = new object();
cat1.name="小妮";
cat1.show = function(){
alert('我的名字叫:'+this.name)
};
var cat2 = new object();
cat2.name="小明";
cat2.show = function(){
alert('我的名字叫:'+this.name)
}; //调用
cat1.show(); //我的名字叫:小妮
cat2.show(); //我的名字叫:小明
这时候如果想创建多一个对象,需要把上面的整个copy多一次,但这造成很多重复,超级乱。所以有了第二种进阶,构造函数
二、构造函数
function Cat(name){
var cat = new object();
cat.name=name;
cat.show = function(){
alert('我的名字叫:'+this.name);
};
rerurn cat;
}
//调用
var cat1 = Cat('小妮');
cat1.show(); //我的名字叫:小妮
var cat2 = Cat('小明');
cat2.show(); //我的名字叫:小明
然而这种方式有个很大的缺点
alert(cat1.show == cat2.show); //false
这就意味着,每一个新创建的对象都拥有自己的一个方法,尽管方法是一模一样的。这件造成很大的浪费,占据资源。所以有了第三种Prototype模式
三、Prototype模式
首先说一下什么是prototype?
.box{color:"#white";}
<div class="box" style="color:#blue"></div>
<div class="box"></div>
<div class="box"></div>
<div class="box"></div>
//相信会点CSS的人也知道,第一个颜色因为行间样式变成blue,其与三个是white,原型的对应关系如下
// CSS JS
// class(一次给一组加样式) 原型
// style(一次给一个加样式) 给对象单独加事件
再来点JS例子:
var arr1 = new Array(1,2,3,4);
var arr2 = new Array(5,6,7,8); Array.prototype.sum = function () { //class方法 全部都有
//arr1.prototype.sum = function () { //style 行间 只有一个有
var result = 0;
for (var i = 0; i < this.length; i++) {
result += this[i];
}
return result;
}; alert(arr1.sum());
alert(arr2.sum());
如果用 arr1.prototype.sum arr2也要调用sum 将会报错,当加在Array共有的类上,才能共享。
同时要注意prototype是加在类上,方法是被对象调用
//错误: Array.push();
//错误: new arr();
//正确: arr.push();
//正确: Array.arr()
言归正传,上面的例子改写为:
function Cat(name){
this.name=name;
}
Cat.prototype.show = function(){
alert('我的名字叫:'+this.name);
};
//调用
var cat1 = new Cat('小妮');
var cat2 = new Cat('小明');
cat1.show(); //我的名字叫:小妮
cat2.show(); //我的名字叫:小明
alert(cat1.show == cat2.show );//true
构造函数加属性,原型加方法,这样就解决了资源浪费。
以上就是一个面向对象的写法。
更新待续.......
js 之面向对象的更多相关文章
- JavaScript--我发现,原来你是这样的JS:面向对象编程OOP[1]--(理解对象和对象属性类型)
一.介绍 老铁们,这次是JS的面向对象的编程OOP(虽然我没有对象,心累啊,但是可以自己创建啊,哈哈). JS高程里第六章的内容,这章内容在我看来是JS中很难理解的一部分.所以分成三篇博客来逐个理清. ...
- JavaScript--我发现,原来你是这样的JS:面向对象编程OOP[2]--(创建你的那个对象吧)
一.介绍 我们继续面向对象吧,这次是面向对象编程的第二篇,主要是讲创建对象的模式,希望大家能从博客中学到东西. 时间过得很快,还是不断的学习吧,为了自己的目标. 二.创建对象 1.前面的创建对象方式 ...
- JS--我发现,原来你是这样的JS:面向对象编程OOP[3]--(JS继承)
一.面向对象编程(继承) 这篇博客是面向对象编程的第三篇,JS继承.继承顾名思义,就是获取父辈的各种"财产"(属性和方法). 怎么实现继承? 我们的JavaScript比较特别了, ...
- JS--我发现,原来你是这样的JS:面向对象编程OOP[2]--(创建你的那个对象吧)
一.介绍 我们继续面向对象吧,这次是面向对象编程的第二篇,主要是讲创建对象的模式,希望大家能从博客中学到东西. 时间过得很快,还是不断的学习吧,为了自己的目标. 二.创建对象 1.前面的创建对象方式 ...
- JavaScript基础笔记(四) JS式面向对象
JS式面向对象 一.理解对象 一)属性类型 ECMA-262 第 5 版在定义只有内部才用的特性(attribute)时,描述了属性(property)的各种特征. ECMA-262 定义这些特性是为 ...
- JS--我发现,原来你是这样的JS:面向对象编程OOP[1]--(理解对象和对象属性类型)
一.介绍 老铁们,这次是JS的面向对象的编程OOP(虽然我没有对象,心累啊,但是可以自己创建啊,哈哈). JS高程里第六章的内容,这章内容在我看来是JS中很难理解的一部分.所以分成三篇博客来逐个理清. ...
- 学JS的心路历程-JS支持面向对象?(一)
昨天在看Prototype看到JS支持面向对象,被前辈问到说那什么是面向对象?JS是面向对象语言吗? 便开始了一连串艰辛爬文过程,今天就来看一下两者有什么差异吧(rgwyjc)! 首先面向对象有三大特 ...
- 探讨 JS 的面向对象中继承的那些事
最近学了 JS 的面向对象,这篇文章主要是探讨 JS 的面向对象中继承的那些事. JS中继承的特点: 1.子类继承父类: 2.子类可以用父类的方法和属性 3.子类的改变可以不影响父类 下面用一个例子来 ...
- 重学前端--js是面向对象还是基于对象?
重学前端-面向对象 跟着winter老师一起,重新认识前端的知识框架 js面向对象或基于对象编程 以前感觉这两个在本质上没有什么区别,面向对象和基于对象都是对一个抽象的对象拥有一系列的行为和状态,本质 ...
随机推荐
- 基于log4j的消息流的实现之二消息传递
在“基于log4j的消息流的实现之一消息获取”中获取日志消息的部分,修改如下: import org.apache.commons.collections.map.HashedMap; import ...
- systemtap没找到函数变量
为啥systemtap没找到函数 hon@station6:~/codebox/stap/net$ sudo stap -L 'kernel.function("sock_recvmsg_n ...
- spring MVC 字符串数组传值 字符带有逗号,问题
按照如下图所示方式传值,想在后台得到一个长度为1的数组,后台直接根据,进行分割,就得到长度为2的数组 1.曲线救国解决法 解决方案, 前端对参数进行编码 encodeURIComponent(valu ...
- [bzoj3886] [USACO15JAN]电影移动Moovie Mooving
题目链接 状压\(dp\). 注意到\(n\leq 20\)且每个只能用一次,所以很显然可以压缩每部电影看过没,记\(f[sta]\)为状态为\(sta\)时最多可以看多久. 转移时先枚举状态,然后枚 ...
- poj2814-拨钟问题-C语言-枚举算法
#include <stdio.h> #include <stdlib.h> /* 首先,我们考虑用长度为9的数组表示表盘的状态以及调表的操作,终止的条件是表盘状态数组所有元素 ...
- HDU 多校对抗赛 A Maximum Multiple
Maximum Multiple Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- js中的Map对象的简单示例
es6提供一个对象Map, 其功能类似于java中的Map, 下面是java中的Map和js中的Map的简单对比: js中的Map.set()相当于java中的Map.put(), js中的Map.s ...
- 证明spring中<property name="">这个双引号的内容只与setter方法有关,与一个类定义的字段和getter方法无关
证明如下: 思路定义两个实体类每个实体类的成员变量(字段)名和setter 和getter的名字都不一样: 原因是:bean的声明周期的原因:有一步是:注入属性. 其中一个类引用了另一个类. 被引用类 ...
- fs.watch 爬坑
上星期用 fs.watch 和 readline.createInterface 对pm2的合并日志做了监控,根据指定的错误信息重启服务 发现不管是手动vim编辑日志,还是等待日志自动输出. fs.w ...
- Spring - IoC(9): @Resoure & @Autowired
@Resource 和 @Autowired 都是用来装配依赖的,它们之间有些异同. @Resoure @Resource 是 JSR-250 规范的注解. @Resource 可以标注在字段.方法上 ...