JavaScript基础13——面向对象
什么是面向对象?
面向对象的特点
对象的组成
OOA和OOD
构造函数
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
// 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——面向对象的更多相关文章
- [.net 面向对象编程基础] (13) 面向对象三大特性——多态
[.net 面向对象编程基础] (13) 面向对象三大特性——多态 前面两节,我们了解了面向对象的的封装和继承特性,面向对象还有一大特性就是多态.比起前面的封装和继承,多态这个概念不是那么好理解.我们 ...
- Javascript基础编程の面向对象编程
javascript是解释型的语言,在编译时和运行时之间没有明显区别,因此需要更动态的方法.javascript没有正式的类的概念,我们可以使用在运行时创建新的对象类型来替代,并且可以随时更改已有对象 ...
- JavaScript基础13——js的string对象
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- python基础(13)-面向对象
类 类的定义和使用 # class Person: def __init__(self, name, age, gender): self.name = name self.age = age sel ...
- Javascript基础回顾 之(三) 面向对象
本来是要继续由浅入深表达式系列最后一篇的,但是最近团队突然就忙起来了,从来没有过的忙!不过喜欢表达式的朋友请放心,已经在写了:) 在工作当中发现大家对Javascript的一些基本原理普遍存在这里或者 ...
- 一个简单的、面向对象的javascript基础框架
如果以后公司再能让我独立做一套新的完整系统,那么我肯定会为这个系统再写一个前端框架,那么我到底该如何写这个框架呢? 在我以前的博客里我给大家展示了一个我自己写的框架,由于当时时间很紧张,做之前几乎没有 ...
- javascript 基础3第13节
<html> <head> <title>javascript基础</title> </head> <body> 1.流程控制 ...
- Web前端基础(13):JavaScript(七)
1. BOM JavaScript基础分为三部分: ECMAScript:JavaScript的语法标准.包括变量.表达式.运算符.函数.if语句.for语句等. DOM:文档对象模型,操作网页上的元 ...
- 第三篇:web之前端之JavaScript基础
前端之JavaScript基础 前端之JavaScript基础 本节内容 JS概述 JS基础语法 JS循环控制 ECMA对象 BOM对象 DOM对象 1. JS概述 1.1. javascript ...
随机推荐
- B树和B+树的增/删结点(转)
add by zhj: 算法其实不复杂,尤其是增加结点的算法,逻辑很简单,但有时自己想不到. 增加结点算法:首先,对于B树,没有重复结点,所以新插入的数据一定会落在叶结点上,或者说落在叶结点的所有父结 ...
- C# zip压缩 Ionic.Zip.dll
#region Ionic.Zip压缩文件 //压缩方法一 public void ExeCompOne() { string FileName = DateTime.Now.ToString(&qu ...
- Android 8.0的平台上,应用不能对大部分的广播进行静态注册
引言在Android 8.0的平台上,应用不能对大部分的广播进行静态注册,也就是说,不能在AndroidManifest文件对有些广播进行静态注册,这里必须强调是有些广播,因为有些广播还是能够注册的. ...
- ASP.NET SignalR 系列(九)之源码与总结
1.SignalR 1.0与2.0有些不同,以上篇章均只支持2.0+ 2.必须注意客户端调用服务端对象和方法时的大小写问题 3.客户端上的方法不能重名 4.IE7及以下的,需要增加json的分析器,分 ...
- LATEX 数学公式基本语法
作者:@houkai本文为作者原创,转载请注明出处:https://www.cnblogs.com/houkai/p/3399646.html TEX 是Donald E. Knuth 编写的一个以排 ...
- 配置 Mac Chrome Inspect
安装libimobiledevice : Could not connect to lockdownd. Exiting. 报错解决 brew uninstall --ignore-depende ...
- IDEA控制台中文乱码问题
Tomcat启动时乱码 在tomcat启动时,控制台中的中文为乱码 在idea安装路径的bin文件夹下,找到idea64.exe.vmoptions这个配置文件,添加如下代码 -Dfile.encod ...
- 很带劲,Android9.0可以在i.MX8开发板上这样跑
米尔MYD-JX8MX开发板移植了Android9.0操作系统,现阶段最高版本的Android9.0操作系统将给您的产品在安全与稳定性方面带来更大的提升.可惜了,这里不能上传视频在i.MX8开发板跑A ...
- android的子线程切换到主线程
在子线程中,如果想更新UI,必须切换到主线程,方法如下: if (Looper.myLooper() != Looper.getMainLooper()) { // If we finish mark ...
- Vue第一天
什么是 Vue.js? Vue.js是前端的主流框架之一,与 Angular.js.React.js一起,并称为前端三大主流框架 Vue.js是一套构建用户界面的框架,只关注视图层,它不仅易上手,还便 ...