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>
用构造函数加属性;
用原型加方法;
 
类似于Array、Date这种,说明它不是普通的函数,是构造函数,类名首字母一般大写;所以这里改成了Person;
 
 
 
 
4.json方式的面向对象:            
json:
简单
不适合多个对象
单体;
 
不适合Person这种需要构造很多的类;
但是适合比如ajax这种的,只需要一个发起请求的类;
 
Json:整个程序里只有一个;写起来比较简单;也可以用做命名空间;
     比如多个叫getUser的:json.common.getUesr;json.fx.getUser; json.site.getUser等..
<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>
 
5.js中的继承:                            
继承:父级的属性和方法
如何继承父级的属性呢?先讲下call方法;
<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的更多相关文章

  1. js面向对象学习 - 对象概念及创建对象

    原文地址:js面向对象学习笔记 一.对象概念 对象是什么?对象是“无序属性的集合,其属性可以包括基本值,对象或者函数”.也就是一组名值对的无序集合. 对象的特性(不可直接访问),也就是属性包含两种,数 ...

  2. 带你一分钟理解闭包--js面向对象编程

    上一篇<简单粗暴地理解js原型链--js面向对象编程>没想到能攒到这么多赞,实属意外.分享是个好事情,尤其是分享自己的学习感悟.所以网上关于原型链.闭包.作用域等文章多如牛毛,很多文章写得 ...

  3. JS面向对象(3) -- Object类,静态属性,闭包,私有属性, call和apply的使用,继承的三种实现方法

    相关链接: JS面向对象(1) -- 简介,入门,系统常用类,自定义类,constructor,typeof,instanceof,对象在内存中的表现形式 JS面向对象(2) -- this的使用,对 ...

  4. JS面向对象(2) -- this的使用,对象之间的赋值,for...in语句,delete使用,成员方法,json对象的使用,prototype的使用,原型继承与原型链

    相关链接: JS面向对象(1) -- 简介,入门,系统常用类,自定义类,constructor,typeof,instanceof,对象在内存中的表现形式 JS面向对象(2) -- this的使用,对 ...

  5. JS面向对象(1) -- 简介,入门,系统常用类,自定义类,constructor,typeof,instanceof,对象在内存中的表现形式

    相关链接: JS面向对象(1) -- 简介,入门,系统常用类,自定义类,constructor,typeof,instanceof,对象在内存中的表现形式 JS面向对象(2) -- this的使用,对 ...

  6. js面向对象的实现(example 二)

    //这个方法和上篇文章(js面向对象的实现(example 一))中的方法类似,但是更为简洁 //通过函数赋值的方式来构造对象 //同样通过闭包的方式来封装对象及内部变量 (function () { ...

  7. 浅谈JS面向对象之创建对象

    hello,everybody,今天要探讨的问题是JS面向对象,其实面向对象呢呢,一般是在大型项目上会采用,不过了解它对我们理解JS语言有很大的意义. 首先什么是面向对象编程(oop),就是用对象的思 ...

  8. js面向对象,有利于复用

    需求:在网页上添加个天气预报. 以前总是在需要执行js的地方,直接写function(){}.在需要同样功能的地方直接copy,或者稍微修改. 然后在网上看看有没有好点的方法,然后就看到js面向对象编 ...

  9. JavaScript基础精华02(函数声明,arguments对象,匿名函数,JS面向对象基础)

    函数声明 JavaScript中声明函数的方式:(无需声明返回值类型) function add(i1, i2) {             return i1 + i2;//如果不写return返回 ...

  10. 原生JS面向对象思想封装轮播图组件

    原生JS面向对象思想封装轮播图组件 在前端页面开发过程中,页面中的轮播图特效很常见,因此我就想封装一个自己的原生JS的轮播图组件.有了这个需求就开始着手准备了,代码当然是以简洁为目标,轮播图的各个功能 ...

随机推荐

  1. 多行文本用textarea而不是input type=textarea“”

    <textarea name="zhaiyao" id="" cols="35" rows="4">< ...

  2. hdu--1029 编程之美 在数组a中 (元素个数n n是奇数)找一个数字 它出现的次数大于(n+1)/2

    我为什么总是犯这些愚蠢错误啊,还是自己逻辑不够严谨. 努力ing...... #include <iostream> #include <cstdio> #include &l ...

  3. 软件产品案例分析——福州大学微信小程序

    一 .调研,评测 评测 第一次上手体验: 刚进入看到菜单界面,感觉还是比较生动清晰的,功能很多,也很全面,包涵了大部分学生所需要的功能,就是第一次身份验证那里找了半天. bug: 1.点击进入学生证附 ...

  4. Caused by: java.sql.SQLException: ORA-24816: 在实际的 LONG 或 LOB 列之后提供了扩展的非 LONG 绑定数据

    今天客户说报告草稿保存不了,跟踪错误bug,了解到以下reason: 异常出现的环境:oracle11g + Hibernate 错误分析:这是oracle 11g在clob字段中的一个bug,ora ...

  5. 使用JQuery提交表单的两种方式选择

    有一个表单,如果使用JQuery提交的话,可以使用下面2中方式,但他们的区别却是根据实际需求需要进行选择的. 第一种:表单按照action路径提交后,页面会刷新. $("#id") ...

  6. 【BZOJ4554】【TJOI2016】【HEOI2016】游戏

    我好弱啊quq 原题: 在2016年,佳缘姐姐喜欢上了一款游戏,叫做泡泡堂.简单的说,这个游戏就是在一张地图上放上若干个炸弹,看 是否能炸到对手,或者躲开对手的炸弹.在玩游戏的过程中,小H想到了这样一 ...

  7. shell excute mongo query command

    use shell command method one: #!/bin/bash ] then echo 'Please input cid' exit fi HOST= mongo ${HOST} ...

  8. nginx配置基于域名的虚拟主机

    其实基于域名和基于ip的虚拟主机配置是差不多的,在配置基于ip的虚拟主机上我们只需要修改几个地方就能变成基于域名的虚拟主机,一个是要修改域名,一个是host文件直接看代码 [root@localhos ...

  9. centos7配置lamp成功安装过

    linux+apache+mysql/mariadb+php 首先apache的安装: yum install httpd 接着mysql/mariadb的安装: yum install mysql ...

  10. Makefile introduction (very old presentation)