什么是面向对象?

面向对象(Object Oriented,OO)是软件开发方法。面向对象的概念和应用已超越了程序设计和软件开发,扩展到如数据库系统,交互式界面,应用结构,应用平台,分布式系统,网络管理结构,CAD技术,人工智能等领域。面向对象是一种对现实世界理解和抽象的方法,是计算机编程技术发展到一定阶段后到产物,是一种高级的编程思想。
 
    面向对象就是一种新的编程模式。

面向对象的特点

    封装:不考虑内部实现,只考虑功能实现
 
    继承:从已有对象上,继承出新对象
    
    多态:多种形态,一个功能的不同的应用场景

对象的组成

    方法(有归属)----函数(自由的)
 
    属性(有归属)----变量(自由的)

OOA和OOD

OOA面向对象分析:
面向对象分析:将大问题拆分成小问题,并试图用分工协作来完成的思维方式。
OOD面向对象设计:
        1.分析模块后,确定职责
            大哥招小弟--端茶倒水,点烟捶背捏脚
 
        2.确定耦合关系
            确定通信关系,如何交流,暗号
            弊端:当耦合达到一定程度时,如果换了一个助理,需要重新耦合,资源消耗太大
           高内聚低耦合

        3.为OOP做准备
 
        分析角色特性:
             我当老师----技术过硬
                   ----讲课技能(口才)
 
             我当销售----沟通技巧(口才)
            
            找到角色共同特性----继承
大量信息的处理和加工困难,打包之后,将内容包含在其中。信息传递速度更快,效率更高
        
    面向对象和面向过程的区别
        面向对象--先实现功能,再运行。分工协作,同时发生,解决问题。
        面向过程--一边实现,一边运行。效率低下。
    
    面向对象并不是程序员发明的。在程序中我们叫面向对象(OO),在生活中叫分工协作。

构造函数

    function CreatPeople(name,age,like){
this.name = name;
this.age = age;
this.like = like;
this.show = function(){
alert("我叫"+this.name+",今年"+this.age+"岁,喜欢"+this.like);
}
}
var obj = new CreatPeople("ABC",20,"PHP");
var obj2 = new CreatPeople("QWE",32,"Python");
obj.show();
obj2.show();

构造函数和对象的关系

    面向对象----对一个对象进行编程
    构造函数----提供一个对象供你编程
 
    通过构造函数,实现面向对象编程

使用Json创建对象

    var obj = {
name:"admin",
age:23,
like:"LOL",
show:function(){
alert("我叫"+this.name+",今年"+this.age+"岁,喜欢"+this.like)
}
}
obj.show()

使用构造函数创建对象

        function CreatPeople(name,age,like){
this.name = name;
this.age = age;
this.like = like;
this.show = function(){
alert("我叫"+this.name+",今年"+this.age+"岁,喜欢"+this.like);
}
}
var obj = new CreatPeople("ABC",20,"PHP");
var obj2 = new CreatPeople("QWE",32,"Python");
obj.show(); obj2.show();

原型的概念

    在对象中,两个新创建的函数,是不相等的:
var obj1 = {
fn:function(){
alert(1);
}
}
var obj2 = {
fn:function(){
alert(1);
}
}
console.log(obj1.fn == obj2.fn); //false 在构造函数中,同样属于两个新创建的函数,也是不相等的
function Fn(name){
this.name = name;
this.show = function(){
alert(this.name);
}
}
var obj1 = new Fn("AAA");
var obj2 = new Fn("BBB");
console.log(obj1.show==obj2.show); //false 此时可以看出构造函数的多次创建会产生多个同名函数,造成冗余太多。 利用原型prototype解决。
function Fn(){}
console.log(Fn.prototype);
//constructor表示当前的函数属于谁
//__proto__ == [[prototype]],书面用语,表示原型链 var fn1 = new Object();
var fn2 = new Object();
Object.prototype.show = function(){
alert(1);
}
console.log(fn1.show==fn2.show); //ture

    此时,任何一个对象的原型上都有了show方法,由此得出,Object.prototype身上的添加的方法,相当于添加到了所有的Object身上。
    
    为了解决构造函数的冗余问题,我们将属性写在构造函数内,方法写在原型中。这是面向对象的编程格式之一。
    面向对象的编程格式之一:
        1.属性写在构造函数内;
        2.方法写在原型中
        3.构造函数中的this指向当前new出来的对象
       4.原型方法中的this指向当前原型所属的函数被new出来的对象
在代码中再次看看区别
   // 1.创建对象:构造函数
// function Fn(){
// this.xxx = xxxx;
// }
// var f = new Fn() // 模型,构造器
function Fn(n){
this.name = n;
this.show();
} Fn.prototype.show = function(){
console.log(this.name)
} var f1 = new Fn("admin");
var f2 = new Fn("root"); // new出来的实例
console.log(f1);
console.log(f2);
console.log(f2 == f1);
console.log(f2.__proto__ == f1.__proto__);
console.log(f2.__proto__.show == f1.__proto__.show); f1.show();
f2.show(); // console.dir(Fn);
// console.log(Fn.length)
// console.log(Fn.name)
// console.log(Fn.prototype)
// console.log(f1.__proto__)
// console.log(f1.__proto__ === Fn.prototype) // // 抽象
// // 具象
// f1.show();
// f2.show();
// console.log(f1.show == f2.show); console.log(f1.abc); // var arr1 = new Array("hello","world");
// var arr2 = new Array("hello","html");
// console.log(arr1);
// console.log(arr2);
// console.log(arr2 == arr1);
// console.log(arr1.length);
// console.log(arr2.length); // arr1.push("hello");
// arr2.push("hello"); // console.log(arr1.push == arr2.push); // Array.prototype.hahaha = function(){}
// var arr = new Array();
// arr.norepeat() // 为什么要相等?节省内存,减少方法的冗余
// 怎么做?写成公共方法
// 怎么实现?
// ↓↓↓↓↓↓↓↓↓
// __proto__:原型链(隐示原型),作用:与自身类型的父级建立连接
// prototype:原型对象(显示原型),只有函数(除了箭头函数)才有,作用:为了给自身被new之后创建出来的实例做父级使用 // 此属性对于函数自身来说,没有用
// 但是这个属性是给函数被new执行创建出的实例,当爸的 // new的原理:
// 1.自动创建一个新对象
// 2.改变了函数内部的this,为第一步的新对象
// 3.将第一步创建的新对象的父级,改成new执行函数的prototype
// 4.检测函数是否主动返回对象,没有,就返回第一步创建的新对象 // 对象读取属性或方法的原则:
// 就近原则:当对象查找自身的属性或方法时,如果自身有,直接使用;如果自身没有,顺着__proto__向上找父级,找到了就使用,没找到,继续向上;直到顶部,还没找到,就抛出undefined;在这个过程中,只要找到了,就停止向上查找。 // 构造函数身上的原型对象身上的方法中的this,依然指向将来构造函数被new出来的实例

面向对象案例——烟火

<!DOCTYPE html>
<html>
<head>
<meta charset = "utf-8">
<title></title>
<style>
.box {width: 800px;height: 600px;background-color: black;margin: 0 auto;position: relative;}
.fire1 {width: 15px;height: 15px;border-radius: 50%;position: absolute;bottom: 0;}
.fire2 {width: 10px;height: 10px;border-radius: 50%;position: absolute;}
</style>
</head>
<body>
<div class="box"></div>
</body>
<script> function Fire(obj){
this.x = obj.x;
this.y = obj.y;
this.cont = obj.parent;
this.onoff = obj.onoff;
this.start();
} Fire.prototype.start = function(){
// 1.创建烟花给样式
this.div = document.createElement("div");
this.div.className = "fire1";
this.div.style.background = randomColor();
this.div.style.left = this.x + "px";
this.cont.appendChild(this.div);
// 开始运动this.transition();
this.transition();
} Fire.prototype.transition = function(){
move(this.div,{top:this.y},()=>{
// 运动,结束后删除
this.div.remove();
// 3创建小烟花this.boom();
this.onoff = this.onoff == 1 ? this.boom1() : this.boom2();
//选择烟花样式
})
} Fire.prototype.boom1 = function(){
// 4.小烟花运动,消失
var num = random(2,3);
for(var i = 0;i < num;i++){
let star = document.createElement("div");
star.className = "fire2";
star.style.background = randomColor();
star.style.left = this.x + "px";
star.style.top = this.y + "px";
this.cont.appendChild(star);
var l = random(0,this.cont.offsetWidth-star.offsetWidth);
var t = random(0,this.cont.offsetHeight-star.offsetHeight);
move(star,{left:l,top:t},function(){
star.remove();
})
}
}
Fire.prototype.boom2 = function(){
// 4.小烟花运动,消失
var num = random(20,35);
var r = random(100,200);
for(var i = 0;i < num;i++){
let star = document.createElement("div");
star.className = "fire2";
star.style.background = randomColor();
star.style.left = this.x + "px";
star.style.top = this.y + "px";
this.cont.appendChild(star);
var l = parseInt(Math.cos(Math.PI/180*(360/num*i))*r)+this.x;
var t = parseInt(Math.sin(Math.PI/180*(360/num*i))*r)+this.y;
move(star,{left:l,top:t},function(){
star.remove();
})
}
} var obox = document.querySelector(".box");
addEvent(obox,"mousemove",function(eve){
var e = eve || window.event;
new Fire({
x:e.offsetX,
y:e.offsetY,
parent:this,
onoff:1
});
}) addEvent(obox,"contextmenu",function(eve){
var e = eve || window.event;
e.preventDefault();
new Fire({
x:e.offsetX,
y:e.offsetY,
parent:this,
onoff:0
});
})
// 运动
function move(ele,obj,fn){
clearInterval(ele.t);
ele.t = setInterval(() => {
var onoff = true;
for(var i in obj){
var pos = parseInt(getComputedStyle(ele,false)[i]);
var speed = (obj[i]-pos)/10;
speed = speed > 0 ? Math.ceil(speed) : Math.floor(speed);
if(pos != obj[i]){
onoff = false;
}
ele.style[i] = pos + speed + "px";
if(onoff == true){
clearInterval(ele.t);
fn && fn();
}
}
}, 30);
} // 范围随机数
function random(max,min){
return Math.round(Math.random()*(max-min)+min);
}
// 随机颜色
function randomColor(){
return "rgb("+random(0,255)+","+random(0,255)+","+random(0,255)+")";
}
// 监听式绑定:
function addEvent(ele,eve,cb){
if(ele.addEventListener){
ele.addEventListener(eve,cb);
}else if(ele.attachEvent){
ele.attachEvent("on"+eve,cb); //ie
}else{
ele["on"+eve] = cb;
}
} </script>
</html>
 
 
 
 

JavaScript基础13——面向对象的更多相关文章

  1. [.net 面向对象编程基础] (13) 面向对象三大特性——多态

    [.net 面向对象编程基础] (13) 面向对象三大特性——多态 前面两节,我们了解了面向对象的的封装和继承特性,面向对象还有一大特性就是多态.比起前面的封装和继承,多态这个概念不是那么好理解.我们 ...

  2. Javascript基础编程の面向对象编程

    javascript是解释型的语言,在编译时和运行时之间没有明显区别,因此需要更动态的方法.javascript没有正式的类的概念,我们可以使用在运行时创建新的对象类型来替代,并且可以随时更改已有对象 ...

  3. JavaScript基础13——js的string对象

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  4. python基础(13)-面向对象

    类 类的定义和使用 # class Person: def __init__(self, name, age, gender): self.name = name self.age = age sel ...

  5. Javascript基础回顾 之(三) 面向对象

    本来是要继续由浅入深表达式系列最后一篇的,但是最近团队突然就忙起来了,从来没有过的忙!不过喜欢表达式的朋友请放心,已经在写了:) 在工作当中发现大家对Javascript的一些基本原理普遍存在这里或者 ...

  6. 一个简单的、面向对象的javascript基础框架

    如果以后公司再能让我独立做一套新的完整系统,那么我肯定会为这个系统再写一个前端框架,那么我到底该如何写这个框架呢? 在我以前的博客里我给大家展示了一个我自己写的框架,由于当时时间很紧张,做之前几乎没有 ...

  7. javascript 基础3第13节

    <html> <head> <title>javascript基础</title> </head> <body> 1.流程控制 ...

  8. Web前端基础(13):JavaScript(七)

    1. BOM JavaScript基础分为三部分: ECMAScript:JavaScript的语法标准.包括变量.表达式.运算符.函数.if语句.for语句等. DOM:文档对象模型,操作网页上的元 ...

  9. 第三篇:web之前端之JavaScript基础

    前端之JavaScript基础   前端之JavaScript基础 本节内容 JS概述 JS基础语法 JS循环控制 ECMA对象 BOM对象 DOM对象 1. JS概述 1.1. javascript ...

随机推荐

  1. TP5配置隐藏入口index.php文件

    隐藏的index.php PS:这里说的入口文件指的是公共/ index.php文件,配置文件就在这个目录下 可以去掉URL地址里面的入口文件index.php,但是需要额外配置WEB服务器的重写规则 ...

  2. Linux ssh 公私钥配置

    Linux ssh 公私钥配置 ssh 公私钥可实现无密码的情况下直接直接登录到服务端.方便我们管理,而且也可以设置ssh完全通过公私钥登录,不可通过密码登录,来提高我们的服务器安全程度. 配置 生成 ...

  3. 客观->感官->意识->语言->思维->世界观、科学->思想

    客观->感官->意识->语言->思维->世界观.科学->思想

  4. DotnetSpider爬虫简单示例 net core

    文章地址 https://blog.csdn.net/sD7O95O/article/details/78097556 安装爬虫框架  NUGET 安装DotnetSpider 创建HTTP协议数据包 ...

  5. fail fast和fail safe策略

    优先考虑出现异常的场景,当程序出现异常的时候,直接抛出异常,随后程序终止 import java.util.ArrayList; import java.util.Collections; impor ...

  6. Echarts X轴多项百分比的展示

    app.title = '堆叠柱状图'; option = { tooltip : { trigger: 'axis', axisPointer : { // 坐标轴指示器,坐标轴触发有效 type ...

  7. CMS-headless or non-headless, page-based or object-based storage?

    内容管理系统对于很多在线教育企业来说都是至关重要的,他不仅可以用于内容的创作,编辑,发布,撤销,展示也可以用于运营或者市场产生他们需要的页面. 传统上,Wordpress是一个非常成功的CMS,他将内 ...

  8. 第一阶段:Java基础 1.JAVA开发介绍---2. JVM、JRE、JDK之间的关系

    JDK :英文名称(Java Development Kit),Java 开发工具包,是针对 Java 开发员的产品.jdk 是整个 Java 开发的核心,包括了Java运行环境JRE.Java工具和 ...

  9. PHP-FPM的相关知识的深度解释

    一.需要搞清楚几个名词概念 1.          CGI(Common Gateway Interface,CGI)通用网关接口, 是Web 服务器运行时外部程序的规范,按CGI 编写的程序可以扩展 ...

  10. 把EXECL表格导入到WORD中

    一般我们在编写开发文档时需要进行表格导入导出,这里提供几种方法供参考. 法一: 打开EXECL,WORD软件,在需要导入表格的地方选择“插入” ,找到“对象选项: ”在对象对话框中点击“由文件创建”, ...