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 ...
随机推荐
- 《C++ 习题与解析》笔记
目录 ####Chapter-1 C++语言概述(错题) ####Chapter-2 类和对象 ####Chapter-3 引用 ####Chapter-4 友元函数 #### Chapter-5 运 ...
- Spark Core知识点复习-2
day1112 1.spark core复习 任务提交 缓存 checkPoint 自定义排序 自定义分区器 自定义累加器 广播变量 Spark Shuffle过程 SparkSQL 一. Spark ...
- excel 使用
列于列拼接
- Java随堂笔记二
变量常量类型转换和命名规范 变量和常量 static double salary = 2500; //属性:变量 //变量作用域: //类变量 static // 局部变量 ...
- 高性能MYSQL(查询优化)
1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索 ...
- (9)ASP.NET Core 中的MVC路由二
1.URL生成 MVC应用程序可以使用路由的URL生成功能,生成指向操作(Action)的URL链接. IUrlHelper 接口用于生成URL,是MVC与路由之间的基础部分.在控制器.视图和视图组件 ...
- DevExpress之GridControl控件小知识
DevExpress之GridControl控件小知识 一.当代码中的DataTable中有建数据关系时,DevExpress 的 GridControl 会自动增加一个子视图 .列名也就是子表的字段 ...
- ffmpeg开发文档
libavcodec - 编码解码器 libavdevice - 输入输出设备的支持 libavfilter - 视音频滤镜支持 libavformat - 视音频等格式的解析 libavutil - ...
- 一篇文章搞定redis
Redis 简介 Redis 是完全开源免费的,遵守 BSD 协议,是一个高性能的 key - value 数据库 Redis 与 其他 key - value 缓存产品有以下三个特点: Redis ...
- Python删除列表元素的3种方法
之前看教程的时候比较着急,对这些基础掌握不好,过来回顾一下 使用del语句删除 lis = [1, 2, 3, 'a', 'b'] print(lis) del lis[0] print(lis) 输 ...