什么是面向对象?

面向对象(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. B树和B+树的增/删结点(转)

    add by zhj: 算法其实不复杂,尤其是增加结点的算法,逻辑很简单,但有时自己想不到. 增加结点算法:首先,对于B树,没有重复结点,所以新插入的数据一定会落在叶结点上,或者说落在叶结点的所有父结 ...

  2. C# zip压缩 Ionic.Zip.dll

    #region Ionic.Zip压缩文件 //压缩方法一 public void ExeCompOne() { string FileName = DateTime.Now.ToString(&qu ...

  3. Android 8.0的平台上,应用不能对大部分的广播进行静态注册

    引言在Android 8.0的平台上,应用不能对大部分的广播进行静态注册,也就是说,不能在AndroidManifest文件对有些广播进行静态注册,这里必须强调是有些广播,因为有些广播还是能够注册的. ...

  4. ASP.NET SignalR 系列(九)之源码与总结

    1.SignalR 1.0与2.0有些不同,以上篇章均只支持2.0+ 2.必须注意客户端调用服务端对象和方法时的大小写问题 3.客户端上的方法不能重名 4.IE7及以下的,需要增加json的分析器,分 ...

  5. LATEX 数学公式基本语法

    作者:@houkai本文为作者原创,转载请注明出处:https://www.cnblogs.com/houkai/p/3399646.html TEX 是Donald E. Knuth 编写的一个以排 ...

  6. 配置 Mac Chrome Inspect

    安装libimobiledevice :  Could not connect to lockdownd. Exiting.  报错解决 brew uninstall --ignore-depende ...

  7. IDEA控制台中文乱码问题

    Tomcat启动时乱码 在tomcat启动时,控制台中的中文为乱码 在idea安装路径的bin文件夹下,找到idea64.exe.vmoptions这个配置文件,添加如下代码 -Dfile.encod ...

  8. 很带劲,Android9.0可以在i.MX8开发板上这样跑

    米尔MYD-JX8MX开发板移植了Android9.0操作系统,现阶段最高版本的Android9.0操作系统将给您的产品在安全与稳定性方面带来更大的提升.可惜了,这里不能上传视频在i.MX8开发板跑A ...

  9. android的子线程切换到主线程

    在子线程中,如果想更新UI,必须切换到主线程,方法如下: if (Looper.myLooper() != Looper.getMainLooper()) { // If we finish mark ...

  10. Vue第一天

    什么是 Vue.js? Vue.js是前端的主流框架之一,与 Angular.js.React.js一起,并称为前端三大主流框架 Vue.js是一套构建用户界面的框架,只关注视图层,它不仅易上手,还便 ...