JS-面向对象
来源:互联网 发布:软件布道师 编辑:程序博客网 时间:2024/06/03 11:21
一、js面向对象的探讨与结论
window.onload=functionready() {
/*js面向对象的探讨与结论*/
// a();//给一个对象添加属性
// b();//给一个对象添加方法
// c();//this:当前方法属于的对象
// d();//利用Object对象创建一个属于自己的对象
// e();//将自己的对象封装在方法里,方便创建,此方法即构造方法(工厂方式)
// f();//完善上一个没有new的缺点
// g();//原型prototype就是给一个对象添加一个方法,使这个方法在这个对象的所有实例上都可用,用来解除不能在外部给一个对象添加一个方法的限制
// h();//利用构造方法加属性、原型加方法的混合方式创建自己的对象
// i();//json方式创建的对象,常用于单体对象,不适合用做多个对象实例
// j();//用更进一层的命名空间将json对象的属性和方法包起来,防止多人开发命名空间冲突
// k();//利用call()继承对象属性
// l();//利用=号继承对象方法,错误方式
// m();//利用for in继承对象方法,正确方式
}
function a() {
var arr=[1,2,3];
arr.a=4;
alert(arr.a);
}
function b() {
var arr=[1,2,3];
arr.b=function () {
alert("arr的方法");
}
arr.b();
}
function c() {
var arr=[1,2,3];
arr.a=4;
arr.b=function () {
alert("arr的方法");
}
arr.c=function () {
alert(this.a);
}
arr.c();
}
function d() {
var obj=new Object();
obj.name="gxy";
obj.qq="1419178613";
obj.showName=function () {
alert("我的名字叫"+this.name);
}
obj.showQq=function () {
alert("我的QQ是"+this.qq);
}
obj.showName();
obj.showQq();
}
function e() {
//构造方法(工厂方式)
function Create(name,qq) {
//原料
var obj=new Object();
//加工
obj.name=name;
obj.qq=qq;
obj.showName=function () {
alert("名字"+this.name);
}
obj.showQq=function () {
alert("QQ"+this.qq);
}
//出厂
return obj;
}
varmy=Create("gxy","1419178613");
my.showName();
my.showQq();
varyou=Create("你的名字","1234567890");
you.showName();
you.showQq();
/*
*缺点
*1.没有new关键字,不规范
*2.每个对象实例的方法都是各自的方法,资源浪费
*/
alert(my.showName==you.showName);
}
function f() {
function Create(name,qq) {
this.name=name;
this.qq=qq;
this.showName=function () {
alert("名字"+this.name);
}
this.showQq=function () {
alert("QQ"+this.qq);
}
}
//用new关键字修饰一个方法,方法中的this关键字将从Window对象指向系统自动新建的Object对象,并返回这个Object对象
var my=newCreate("gxy","1419178613");
my.showName();
my.showQq();
var you=newCreate("你的名字","1234567890");
you.showName();
you.showQq();
}
function g() {
//使用原型前,Create的两个实例my、you想要添加showAll方法,都得各自创建一遍
function Create(name,qq) {
this.name=name;
this.qq=qq;
this.showName=function () {
alert("名字"+this.name);
}
this.showQq=function () {
alert("QQ"+this.qq);
}
}
var my=newCreate("gxy","1419178613");
var you=newCreate("你的名字","1234567890");
my.showAll=function () {
alert("名字"+my.name+""+"QQ"+my.qq);
}
you.showAll=function () {
alert("名字"+you.name+""+"QQ"+you.qq);
}
my.showAll();
you.showAll();
//使用原型后,Create的两个实例my、you想要添加showAll方法,只需给父对象Create创建一遍
function Create(name,qq) {
this.name=name;
this.qq=qq;
this.showName=function () {
alert("名字"+this.name);
}
this.showQq=function () {
alert("QQ"+this.qq);
}
}
Create.prototype.showAll=function () {
alert("名字"+this.name+""+"QQ"+this.qq);
}
var my=newCreate("gxy","1419178613");
var you=newCreate("你的名字","1234567890");
my.showAll();
you.showAll();
//不使用原型创建的对象方法不相等,浪费资源
alert(my.showName==you.showName);
//使用原型创建的对象方法不再不相等,不再浪费资源
alert(my.showAll==you.showAll);
/*
*Create父对象相当于模具,没有实际功能,所以js不允许其在外部添加方法.showAll=function(){}
*my、you实例是由Create模具生产出来的产品,有实际功能,所以js允许其直接在外部添加方法.showAll=function(){}
* 想要给Create父对象在外部添加方法,就需要使用原型prototype解除限制
*/
}
function h() {
//构造方法加属性
function Create(name,qq) {
this.name=name;
this.qq=qq;
this.showName=function () {
alert("名字"+this.name);
}
this.showQq=function () {
alert("QQ"+this.qq);
}
}
//原型加方法
Create.prototype.showName=function () {
alert("名字"+this.name);
}
Create.prototype.showQq=function () {
alert("QQ"+this.qq);
}
Create.prototype.showAll=function () {
alert("名字"+this.name+""+"QQ"+this.qq);
}
//实例化对象并使用方法
var my=newCreate("gxy","1419178613");
my.showName();
my.showQq();
my.showAll();
}
function i() {
var json={
name:'you',
qq:'1234567890',
showName:function () {
alert("名字"+this.name);
},
showQq:function () {
alert("QQ"+this.qq);
}
};
json.showName();
json.showQq();
}
function j() {
var json={};
json.my={};
json.you={};
json.my.showName=function () {
alert("myName");
}
json.you.showName=function () {
alert("yourName");
}
json.my.showName();
json.you.showName();
}
function k() {
function A() {
this.a="a";
}
A.prototype.showA=function () {
alert(this.a);
}
function B() {
//B继承A的属性
A.call(this);
}
var obj=new B();
alert(obj.a);
}
function l() {
function A() {
this.a="a";
}
A.prototype.showA=function () {
alert(this.a);
}
function B() {
A.call(this);
}
//利用=号会创建方法的引用,而不是正真的新创建一份,由于操作的是同一块内存空间,所以A也会使用到这块内存空间里添加的方法showB()
B.prototype=A.prototype;
B.prototype.showB=function () {
alert("b")
}
//对象A将能够使用对象B的方法
var obj=new A();
obj.showB();
}
function m() {
function A() {
this.a="a";
}
A.prototype.showA=function () {
alert(this.a);
}
function B() {
A.call(this);
}
//利用for in遍历A对象的方法原型,赋给B对象的方法原型,真正的新创建一份
for(var i in A.prototype){
B.prototype[i]=A.prototype[i];
}
B.prototype.showB=function () {
alert("b")
}
//对象A将不能使用对象B的方法
var obj=new A();
try {
obj.showB();
}catch (err){
alert(err.message);
}
//对象B能正确继承A里面的方法
var obj=new B();
obj.showA();
}
二、js面向对象的范例
【.html】
<!DOCTYPE html>
<htmllang="en">
<head>
<meta charset="UTF-8">
<title>js面向对象范例</title>
</head>
<body>
<divid="box1" class="box1" style="width: 100px;height:100px;background-color: skyblue;position:absolute;">自由拖动的Oop</div>
<divid="box2" class="box2" style="width: 100px;height:100px;background-color: pink;position:absolute;">限制网页内拖动的ExtentOop,继承自Oop</div>
<scriptsrc="js/js面向对象范例.js"></script>
</body>
</html>
【.js】
window.onload=functionready() {
/*js面向对象范例*/
// opp();//面向过程的写法
new Oop('box1');//面向对象的写法
new ExtentOop('box2');//继承上面的对象,并重写了拖动的方法
}
/*
*面向过程的写法
*/
function opp() {
varbox=document.getElementById("box1");
box.onmousedown=function (ev) {
var oEvent=ev||event;
var boxX=oEvent.clientX-box.offsetLeft;
var boxY=oEvent.clientY-box.offsetTop;
document.onmousemove=function (ev) {
var oEvent=ev||event;
box.style.left=oEvent.clientX-boxX+'px';
box.style.top=oEvent.clientY-boxY+'px';
}
document.onmouseup=function () {
document.onmousemove=null;
document.onmouseup=null;
}
}
}
/*
*面向对象的写法
*/
function Oop(id) {
var _this=this;
this.box=document.getElementById(id);//盒子
this.boxX;//盒子的横坐标
this.boxY;//盒子的纵坐标
this.box.onmousedown=function (ev){//控制盒子移动的方法
_this.fnDown(ev);
//设置文字不能被选中
return false;
};
}
Oop.prototype.fnDown=function(ev){//盒子被点击的方法
var _this=this;
var oEvent=ev||event;
this.boxX=oEvent.clientX-this.box.offsetLeft;
this.boxY=oEvent.clientY-this.box.offsetTop;
document.onmousemove=function (ev) {
_this.fnMove(ev);
}
document.onmouseup=function () {
_this.fnUp();
}
}
Oop.prototype.fnMove=function(ev){//盒子被拖动的方法
var oEvent=ev||event;
this.box.style.left=oEvent.clientX-this.boxX+'px';
this.box.style.top=oEvent.clientY-this.boxY+'px';
}
Oop.prototype.fnUp=function(){//盒子被放开的方法
document.onmousemove=null;
document.onmouseup=null;
}
/*
*继承上面的对象,并重写了拖动的方法
*/
function ExtentOop(id){
Oop.call(this,id);
}
for (var i inOop.prototype){
ExtentOop.prototype[i]=Oop.prototype[i];
}
ExtentOop.prototype.fnMove=function(ev) {//重写父对象的拖动方法
var oEvent=ev||event;
var leftBorder=oEvent.clientX-this.boxX;
var topBorder=oEvent.clientY-this.boxY;
vardomWidthOfBox=document.documentElement.clientWidth-this.box.offsetWidth;
vardomHeightOfBox=document.documentElement.clientHeight-this.box.offsetHeight;
if(leftBorder<0){
leftBorder=0;
}else if(leftBorder>domWidthOfBox){
leftBorder=domWidthOfBox;
}
if(topBorder<0){
topBorder=0;
}else if(topBorder>domHeightOfBox){
topBorder=domHeightOfBox;
}
this.box.style.left=leftBorder+'px';
this.box.style.top=topBorder+'px';
}
- js面向对象尝试
- js面向对象
- 面向对象的js
- js中的面向对象
- JS面向对象
- JS面向对象2
- 06 JS面向对象
- JS 面向对象
- JS面向对象例子
- 面向对象 js 打包
- js面向对象设计
- js面向对象
- js--面向对象
- js面向对象总结
- js面向对象工作总结
- js面向对象
- js面向对象
- js面向对象思想
- vue实现stickUp的效果
- ubuntu16.04登录后无dash,无启动栏launch,无menu bar,只有桌面背景解决办法
- Python入门 第六天(模块、面向对象、类和实例)
- Java源码之ArrayList
- sql语句中as的用法和作用
- JS-面向对象
- 【C/C++】智能指针auto_ptr,share_ptr,unique_ptr
- Hive在查询中使用过滤
- javase之反射
- Splay 维护序列 / 块状链表 NOI 2003
- 如何将spark streaming处理结果保存到关系型数据库中
- SparkStreaming Direct模式总结
- python设计模式之命令模式
- CentOS7 安装Elasticsearch 5.5