面向对象
2015-08-23 23:33
357 查看
面向对象
原型和构造函数对象是拥有属性和方法的数据,属性是与对象相关的值!方法是能够在对象上执行的动作!
如何创建一个对象呢:
var p=new Object(); 关键字new一个p的对象实例! p.name="doubi"; p.gerden="nan"; p.say=function(){ alert("00000") } p.say() //调用p对象里面的say方法1
也可以这样写
var p={ name:"zhangsan", age:18, say:function(){ alert(this.name) } } people.say();
可以使用delete p.name删除对象的某个属性!
我们还可以自己创建一个对象!
function p(name,age){ this.name=name; this.age=age; this.changeName=function(newName){ this.name=newName; } } var zhangsan=new p("zhangsan",18); zhangsan.changeName(lisi); alert(zhangsan.name+""+zhangsan.age) 输出的结果为:lisi 18;
因为字子级没有的情况下会向父级寻找!
JavaScript中的所有事物都是对象:字符串、数字、数组、日期、等等!
创建对象部分
1、工厂模式工厂模式抽象了创建具体对象的过程,考虑到ECMA无法创建类开发人员发明了一种函数,用函数封装了创建对象的细节
function createP(name,age,sex){ var o=new Object(); o.name=name; o。sex=sex; o.age=age; o.say=function(){ alert(0) } return o; } var zhangsan=cueatep("zhansan","18","male") alert(zhangsan.name)
//输出结果为 ”zhangsan“
2.构造函数模式
用于构造一个对象出来的函数就是构造函数!例如:Object 和数组等等!
function P(name,age,sex){ this.name=name; this.age=age; this.sex=sex; this.say=function(){ alert(this.name) } } var zhangsan=new p(zhangsan,18,male); zhangsan。say();
返回得结果为:zhnagsan;
构造函数和工厂模式的区别:构造函数直接属性和方法赋值给了this对象,没有return语句!需要注意的是构造函数开头字母必须大写
注意点:每个通过构造函数创建出来的对象都有一个constructor属性例如alert(zhangsan.constructor)//返回得是整个P;alert(zhangsan.constructor==P)//返回的是true
构造函数也是函数,也可以当做参数传递!
1.var zhangsan=new People(”zhangsan“,18,male);//当做构造函数使用!
2.People(”zhangsan“,18,male)//当做普通函数使用!
3.var o=new Object(); people.call(o,"zhangsan",18,male) o.say();//这个就是call方法 也叫作伪继承!这样就可以通过people调用o中的属性和方法!
call方法:
语法:xxx.call([thisObj[,arg1[, arg2[, [,.argN]]]]]) arguments
定义:调用一个对象的call方法,以另一个对象替换当前对象。
说明;call方法可以用来代替另一个对象调用一个方法。call方法可将一个函数的对象上下文从初初始的上下文改变为由thisObject制定的行对象。如果没有提供thisObject参数,那么Global对象被用作thisObject。
function add(a,b){ alert(a+b); }
function sub(a,b){ alert(a-b) } add.call(sub,3,1); 返回的结果为4!
function People(name,age){ this.name=name; this.age=age; this.say=function(){ alert(this.name+" "+this.age); } } function Student(sName,sAge){ //调用一个对象的call方法,以另一个对象替换当前对象。 People.call(this(指的是Student),sName,sAge);//发生了继承----伪装继承 } var zhangsan=new Student("zhangsan",18); zhangsan.say(); function Teacher(name,age){ People.call(this,name,age); } var laowang=new Teacher("laowang",43); laowang.say();
apply方法 语法:apply([thisObj[,argArray]])
定义:应用某一对象的一个方法,用另一个对象替换当前对象。
如果 argArray 不是一个有效的数组或者不是 arguments 对象,那么将导致一个 TypeError。 如果没有提供 argArray 和 thisObj 任何一个参数,那么 Global 对象将被用作 thisObject, 并且无法被传递任何参数。
function Animal(){ this.name="animal"; this.showname=function(){ alert(this.name); } } function Cat(){ this.name="cat" } var animal=new Animal(); var cat =new Cat(); //通过call或apply方法,将原本属于Animal对象的showName()方法交给对象cat来使用了。 //输入结果为"Cat" //animal.showName.call(cat,","); animal.showName.apply(cat,[]); 实现继承 function Animal(name){ this.name = name; this.showName = function(){ alert(this.name); } } function Cat(name){ Animal.call(this, name); } var cat = new Cat("Black Cat"); cat.showName();
构造函数的问题
关键在方法上:
function People(name,age,sex){ this.name=name; this.age=age; this.sex=sex; this.say=new Function("alert(this.name)") } var zhangsan=new People("zhangsan",18,male) zhangsan.say(); var zhangsan=new People("zhangsan",18,"male"); var lisi=new People("lisi",18,"male"); alert(zhangsan.say===lisi.say)==false
解决的方法:
function People(name,age,sex){ this.name=name; this.age=age; this.sex=sex; this.say=say; } function say(){ alert(this.name) } var zhangsan=new People("zhangsan",18,"male"); var lisi=new People("lisi",18,"male"); alert(zhangsan.say===lisi.say)
相关文章推荐
- 安卓开发语句记录1
- notify丢失、虚假唤醒
- android-async-http将json封装到body体中
- runtime-运行时机制
- hdu3665-Seaside(SPFA,dijkstra,floyd)
- 不带头结点的单链表的基本操作
- /var/log目录中Linux日志文件的功能详解
- Redis字符串类型操作
- setOnTouchListener与setOnKeyListener
- 通知
- linux 网络管理基础 OSI ISO IOS的区别
- 一语中的
- iOS 一个很简单的使用类的代码,和.net很像,很好理解
- CentOS基本命令学习
- 带头结点的单链表的基本操作
- 利用GDAL从内存中直接解析图像数据
- iOS 一个很简单的使用类的代码,和.net很像,很好理解
- mysql 字符串转日期
- Android Binder机制分析
- java新手笔记26 Frame