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的轮播图组件.有了这个需求就开始着手准备了,代码当然是以简洁为目标,轮播图的各个功能 ...
随机推荐
- 在windows 上的RedisClient 上连接远程linux redis ("jave.net.ConnectException: Connection refused:connect")
1.把防火墙禁用掉 2.redis.conf配置文件,注释掉bind 127.0.0.1 3.重启redis服务
- eclipse 启动tomcat 出现错误Could not publish server configuration: null. java.lang.NullPointerException
若出现以上错误,则很有可能是修改了conf/server.xml的内容,将改过的地方改回去,然后重启tomcat 就可以啦
- Python学习手册
基础 概念 源码编译为字节码,解释器解释字节码 CPython是python标准实现方式,Jython将源码编译为java字节码,运行在JVM上 优点:快速开发,灵活的核心数据类型,优美的缩进语法,垃 ...
- 使用 loki grafana 分析nginx 请求日志
loki 是类似prometheus 的log 可视化展示.收集系统,已经集成在grafana 6.0 版本中了 说明: 测试环境使用了docker-compose 运行 环境准备 docker-co ...
- Using gcc stack debug skill
The stack error is hard to debug, but we can debug it assisted by the tool provided by GCC. As we kn ...
- android设备兼容性
原文地址:http://developer.android.com/guide/practices/compatibility.html android被设计成能够在多种不同的设备上执行的系统,为了达 ...
- Dev TextEdit 输入提示
TextEdit.Properties.NullValuePromptShowForEmptyValue = true; TextEdit.Properties.NullValuePrompt = “ ...
- WinForm中执行JS代码(多种方法)
方法一 使用微软官方组件Interop.MSScriptControl 1.msscript.ocx下载的地址 http://www.microsoft.com/downloads/details ...
- 拷贝某个区间(copy,copy_back)
copy 为outputIterator中的元素赋值而不是产生新的元素,所以outputIterator不能是空的 如要元素安插序列,使用insert成员函数或使用copy搭配insert_itera ...
- 如何利用 Chrome 来模拟移动网络来调试 FastAdmin 网站
如何利用 Chrome 来模拟移动网络来高度 FastAdmin 网站 因为目前大多数都在开发移动类的网页,所以客户端的速度下载速度要也考虑. 虽然都已经 4G 了,但还是要看看在网络质量很差的情况 ...