面向对象

面向对象

原型和构造函数

对象是拥有属性和方法的数据,属性是与对象相关的值!方法是能够在对象上执行的动作!

如何创建一个对象呢:

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)

 

posted @ 2015-08-23 23:33  QWERDF  阅读(243)  评论(0编辑  收藏  举报