js面向对象1
1.在空白的Object上加属性和方法:
<script type="text/javascript">
function createPerson(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;
} var obj1 = createPerson("blue","2312371239");
obj1.showName();
obj1.showQQ(); var obj2 = createPerson("shangsan","97979797872");
obj2.showName();
obj2.showQQ(); /*
* 上述工厂方式创建对象的缺点:每次创建一个对象,都是自己的函数showName,showQQ,如果有很多的createPerson的话,那么就多出了很多的对象;
* 会占用很多的系统内存;
*/ </script>
上述的createPerson叫构造函数,只是因为它的作用就是构造一个对象,和普通函数并没有什么不同;
但是这个createPerson创建对象,有两个缺点:
1.没有new关键字;
2.每次创建一个对象,每个对象上都有自己的函数,如果调用了成百上千个createPerson的话,函数大量重复,占用系统资源大,浪费。
2.先解决没有new关键字:
<script type="text/javascript">
function createPerson(name, qq){ //构造函数
//系统偷偷替咱们做:
//var this = new Object(); this.name = name;
this.qq = qq;
this.showName = function(){
alert("我的名字叫:"+this.name);
}
this.showQQ=function(){
alert("我的qq号:"+this.qq);
} //系统也会偷偷做一些:
//return this;
} var obj1 = new createPerson("blue","2312371239");
obj1.showName();
obj1.showQQ(); var obj2 = new createPerson("shangsan","97979797872");
obj2.showName();
obj2.showQQ(); </script>
3.解决资源浪费的问题;
在解决资源浪费问题之前,介绍prototype原型的概念:
原型:
CSS JS
class 一次给一组元素加样式 原型
行间样式 一次给一个元素加样式 给对象加东西 .box{background:red;}
<div class="box" style="background:green;"></div>
<div class="box"></div>
<div class="box"></div>
<div class="box"></div>
举个例子:数组是没有求和方法的,这里写一个求和方法:
<script type="text/javascript">
var arr1 = new Array(1,2,45,34);
var arr2 = new Array(1,2,33); arr1.sum=function(){
var result = 0;
for(var i=0; i<this.length; i++){
result+= this[i];
}
return result;
} alert(arr1.sum());
alert(arr2.sum()); </script>
但是只能弹出arr1的和,因为这里只是给了arr1加了sum方法,相当于行间样式一样,只是给了某一个对象单独添加了sum方法;
因此,如果要arr2也具有sum方法,这么做:
<script type="text/javascript">
var arr1 = new Array(1,2,45,34);
var arr2 = new Array(1,2,33); Array.prototype.sum=function(){
var result = 0;
for(var i=0; i<this.length; i++){
result+= this[i];
}
return result;
} alert(arr1.sum());
alert(arr2.sum()); </script>
把原型用到面向对象里面:这里把createPerson改成了Person类:
<script type="text/javascript">
function Person(name, qq){ //构造函数
this.name = name;
this.qq = qq;
}
Person.prototype.showName= function(){
alert("我的名字叫:"+this.name);
}
Person.prototype.showQQ = function(){
alert("我的qq号:"+this.qq);
} var obj1 = new Person("blue","2312371239");
obj1.showName();
obj1.showQQ(); var obj2 = new Person("shangsan","97979797872");
obj2.showName();
obj2.showQQ(); alert(obj1.showName == obj2.showName); //true,都有showName方法并且是同一个,因为都是来自于原型上的 </script>
<script type="text/javascript">
var json = {
name:'blue',
qq:'11231234324',
showName:function(){
alert('我的名字是:'+this.name);
},
showQQ:function(){
alert('我的QQ号是:'+this.qq);
}
} json.showName();
json.showQQ(); </script>
<script type="text/javascript">
function show(){
alert(this);
} //show(); //window
//show.call(); //和上面一句话是完全一样的;window
//但是和普通的调用又有一点区别;它可以改变里面的this
//show.call(12); // 12 function show2(a, b){
alert("this是:"+this+"\na是:"+a+"\nb是:"+b);
}
//show2(12,5); //this是window a是12 b是5
show2.call('abc', 12, 5); //this是abc a是12 b是5 </script>
于是继承的例子:
<script type="text/javascript">
function A(){
this.abc = 12;
} A.prototype.show=function(){
alert(this.abc);
} //继承A
function B(){
//this->new B()
A.call(this);
}
B.prototype=A.prototype;
</script>
A.call(this), B从A哪里继承了属性;
B.prototype=A.prototype;B从A那里继承了方法;
但是上面的继承可能会有点问题:
B上面可能不光有从A哪里继承来的方法,也可能会有自己的方法;
<script type="text/javascript">
function A(){
this.abc = 12;
} A.prototype.show=function(){
alert(this.abc);
} //继承A
function B(){
//this->new B()
A.call(this);
}
B.prototype=A.prototype;
B.prototype.fn=function(){
alert('abc');
} var objB = new B();
var objA = new A(); //也能正常弹出abc,但是A上面不应该有;因为fn方法是加在B上面的;
//这是因为B.prototype=A.prototype这句话是把A原型的引用赋值给B原型的;
//相当于A.prototype和B.prototype指向了同一个引用,一个人去引用,A和B的prototype都变了;
objA.fn(); </script>
怎么修改这个问题呢?下面:
<script type="text/javascript">
function A(){
this.abc = 12;
} A.prototype.show=function(){
alert(this.abc);
} //继承A
function B(){
A.call(this);
}
for(var i in A.prototype){
B.prototype[i] = A.prototype[i];
} B.prototype.fn=function(){
alert('abc');
} //测试
var objB = new B();
var objA = new A();
objB.show(); //
objB.fn(); //abc
objA.fn(); //报错 </script>
js面向对象1的更多相关文章
- js面向对象学习 - 对象概念及创建对象
原文地址:js面向对象学习笔记 一.对象概念 对象是什么?对象是“无序属性的集合,其属性可以包括基本值,对象或者函数”.也就是一组名值对的无序集合. 对象的特性(不可直接访问),也就是属性包含两种,数 ...
- 带你一分钟理解闭包--js面向对象编程
上一篇<简单粗暴地理解js原型链--js面向对象编程>没想到能攒到这么多赞,实属意外.分享是个好事情,尤其是分享自己的学习感悟.所以网上关于原型链.闭包.作用域等文章多如牛毛,很多文章写得 ...
- JS面向对象(3) -- Object类,静态属性,闭包,私有属性, call和apply的使用,继承的三种实现方法
相关链接: JS面向对象(1) -- 简介,入门,系统常用类,自定义类,constructor,typeof,instanceof,对象在内存中的表现形式 JS面向对象(2) -- this的使用,对 ...
- JS面向对象(2) -- this的使用,对象之间的赋值,for...in语句,delete使用,成员方法,json对象的使用,prototype的使用,原型继承与原型链
相关链接: JS面向对象(1) -- 简介,入门,系统常用类,自定义类,constructor,typeof,instanceof,对象在内存中的表现形式 JS面向对象(2) -- this的使用,对 ...
- JS面向对象(1) -- 简介,入门,系统常用类,自定义类,constructor,typeof,instanceof,对象在内存中的表现形式
相关链接: JS面向对象(1) -- 简介,入门,系统常用类,自定义类,constructor,typeof,instanceof,对象在内存中的表现形式 JS面向对象(2) -- this的使用,对 ...
- js面向对象的实现(example 二)
//这个方法和上篇文章(js面向对象的实现(example 一))中的方法类似,但是更为简洁 //通过函数赋值的方式来构造对象 //同样通过闭包的方式来封装对象及内部变量 (function () { ...
- 浅谈JS面向对象之创建对象
hello,everybody,今天要探讨的问题是JS面向对象,其实面向对象呢呢,一般是在大型项目上会采用,不过了解它对我们理解JS语言有很大的意义. 首先什么是面向对象编程(oop),就是用对象的思 ...
- js面向对象,有利于复用
需求:在网页上添加个天气预报. 以前总是在需要执行js的地方,直接写function(){}.在需要同样功能的地方直接copy,或者稍微修改. 然后在网上看看有没有好点的方法,然后就看到js面向对象编 ...
- JavaScript基础精华02(函数声明,arguments对象,匿名函数,JS面向对象基础)
函数声明 JavaScript中声明函数的方式:(无需声明返回值类型) function add(i1, i2) { return i1 + i2;//如果不写return返回 ...
- 原生JS面向对象思想封装轮播图组件
原生JS面向对象思想封装轮播图组件 在前端页面开发过程中,页面中的轮播图特效很常见,因此我就想封装一个自己的原生JS的轮播图组件.有了这个需求就开始着手准备了,代码当然是以简洁为目标,轮播图的各个功能 ...
随机推荐
- XTU1254 Blance 如何实现称出1∼n 克的物品,请问最少需要几颗砝码?
题目描述 小明有一架天平,小明想称出1∼n 克的物品,请问最少需要几颗砝码? 比如小明想称出1∼4 克的物品,需要2颗砝码,为1和3克. balance 输入 第一行是一个整数T(1≤T≤10000) ...
- 【HDOJ1051】【排序+LIS】【贪心】
http://acm.hdu.edu.cn/showproblem.php?pid=1051 Wooden Sticks Time Limit: 2000/1000 MS (Java/Others) ...
- Python基础进程和线程
一 背景知识 进程的概念起源于操作系统,是操作系统最核心的概念. 进程是对正在运行程序的一个抽象,操作系统的其他所有内容都是围绕进程的概念展开的.所以想要真正了解进程,必须事先了解操作系统,egon介 ...
- MySQL系列-优化之like关键字 创建索引
原文: https://blog.csdn.net/ufo___/article/details/81164996 MySQL系列-优化之覆盖索引: https://blog.csdn.net/UF ...
- <---------------------装箱,拆箱的过程-------------------------->
基本类型包装类: 程序界面用户输入的数据都是以字符串类型存储的,转换成基本数据类型. 八种基本类型对应的包装类: 装箱和拆箱: public class InterDemo { public stat ...
- pghoard 面向云存储的pg 备份&&恢复工具
pghoard 面向云存储的pg 备份&&恢复工具 包含的特性 自动定期basebackup 自动事务日志(WAL / Xlog软件)备份(使用pg_receivexlog, arch ...
- pushpin Server-sent events && openresty 集成试用
前边有写过一个简单pushpin 集成stream 的demo,这次测试下sse 的功能 备注: 环境依然使用的是docker-compose运行 环境准备 docker-compose 文件 ver ...
- Visual Studio不显示智能提示代码,快捷键Alt+→也不出现
最近安装了Dev Express的控件,我的vs2017 Enterprise版的环境,智能提示补全代码的快捷键功能,好像被修改了,不能使用了. 我原来的时候,比如在代码中输入如下代码: Consol ...
- 【转】iOS编译OpenSSL静态库(使用脚本自动编译)
原文网址:https://www.jianshu.com/p/651513cab181 本篇文章为大家推荐两个脚本,用来iOS系统下编译OpenSSL通用库,如果想了解编译具体过程,请参看<iO ...
- 第一个appium的Demo
原文来自:一颗糖果 http://www.cnblogs.com/linglingyuese/articles/8418311.html 一.环境搭建 略(后期补) 二.创建一个测试apk包的项目 ...