您的位置:首页 > 其它

面向对象

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)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: