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. 在windows 上的RedisClient 上连接远程linux redis ("jave.net.ConnectException: Connection refused:connect")

    1.把防火墙禁用掉 2.redis.conf配置文件,注释掉bind 127.0.0.1 3.重启redis服务

  2. eclipse 启动tomcat 出现错误Could not publish server configuration: null. java.lang.NullPointerException

    若出现以上错误,则很有可能是修改了conf/server.xml的内容,将改过的地方改回去,然后重启tomcat 就可以啦

  3. Python学习手册

    基础 概念 源码编译为字节码,解释器解释字节码 CPython是python标准实现方式,Jython将源码编译为java字节码,运行在JVM上 优点:快速开发,灵活的核心数据类型,优美的缩进语法,垃 ...

  4. 使用 loki grafana 分析nginx 请求日志

    loki 是类似prometheus 的log 可视化展示.收集系统,已经集成在grafana 6.0 版本中了 说明: 测试环境使用了docker-compose 运行 环境准备 docker-co ...

  5. 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 ...

  6. android设备兼容性

    原文地址:http://developer.android.com/guide/practices/compatibility.html android被设计成能够在多种不同的设备上执行的系统,为了达 ...

  7. Dev TextEdit 输入提示

    TextEdit.Properties.NullValuePromptShowForEmptyValue = true; TextEdit.Properties.NullValuePrompt = “ ...

  8. WinForm中执行JS代码(多种方法)

    方法一 使用微软官方组件Interop.MSScriptControl 1.msscript.ocx下载的地址   http://www.microsoft.com/downloads/details ...

  9. 拷贝某个区间(copy,copy_back)

    copy 为outputIterator中的元素赋值而不是产生新的元素,所以outputIterator不能是空的 如要元素安插序列,使用insert成员函数或使用copy搭配insert_itera ...

  10. 如何利用 Chrome 来模拟移动网络来调试 FastAdmin 网站

    如何利用 Chrome 来模拟移动网络来高度 FastAdmin 网站 因为目前大多数都在开发移动类的网页,所以客户端的速度下载速度要也考虑. 虽然都已经 4G 了,但还是要看看在网络质量很差的情况 ...