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. 环境变量、cp、mv、cat 等命令

    1.环境变量: PATH 个人理解 环境变量,即是所有命令文件所存放的目录,或是人为的定义的目录,(命令文件所存放的目录,当输入一个命令的时候,系统会自动找到且不报错,并不需要输入绝对路径,来运行相关 ...

  2. Hive错误:Permission denied: user=anonymous, access=EXECUTE, inode=”/tmp”

    由于Hive没有hdfs:/tmp目录的权限,赋权限即可: hdfs dfs -chmod -R 777 /tmp

  3. NET Core MVC中创建PDF

    使用Rotativa在ASP.NET Core MVC中创建PDF 在本文中,我们将学习如何使用Rotativa.AspNetCore工具从ASP.NET Core中的视图创建PDF.如果您使用ASP ...

  4. 20165313 《Java程序设计》第一周学习总结

    教材学习内容总结 1.Java的地位 1.网络地位 2.语言地位 3.需求地位 2.Java的特点 1.简单 2.面向对象 3.平台无关 4.多线程 5.动态 3.安装JDK(重点) 注释:需修改系统 ...

  5. NIO 多人聊天室

    一前言 在家休息没事,敲敲代码,用NIO写个简易的仿真聊天室.下面直接讲聊天室设计和编码.对NIO不了解的朋友,推荐一个博客,里面写的很棒: https://javadoop.com/     里面有 ...

  6. JavaScript 缓存基本原理

    // 这是个闭包函数,接收一个函数,可以把接收的函数转换成具有缓存能力的函数 var memoize = function(f) { // 使用一个 cache 对象来进行缓存 var cache = ...

  7. 我的TDD实践---CI持续集成

    “我的TDD实践”系列之CI持续集成 写在前面: 我的TDD实践这几篇文章主要是围绕测试驱动开发所展开的,其中涵盖了一小部分测试理论,更多的则是关注工具的使用及环境的搭建,做到简单实践先行,后理论专精 ...

  8. smb文件共享实现

    samba文件共享 首先安装软件 yum install samba -y 编辑配置文件 /etc/samba/smb.conf ,在文章最后添加以下内容 [smbtest] content = do ...

  9. linux 之sed

    sed 用法 sed [-nefr] [action] -i 直接修改文件内容,而不是像其他命令那样只是输出到终端 a新增c取代d删除i插入p列印常与sed -n 使用s取代 有一点需要注意的是:如果 ...

  10. Understanding Complex Event Processing (CEP)/ Streaming SQL Operators with WSO2 CEP (Siddhi)

    转自:https://iwringer.wordpress.com/2013/08/07/understanding-complex-event-processing-cep-operators-wi ...