码迷,mamicode.com
首页 > 其他好文 > 详细

面向对象

时间:2015-08-21 22:55:23      阅读:127      评论:0      收藏:0      [点我收藏+]

标签:

对象——原型与构造函数

  • 对象

万物皆对象

对象

面向对象的编程语言中有一个非常重要的参数,那就是类的概念,通过类我们可以创建出来各种各样的对象,而ECMAscript中没有类的概念,所以他与别的编程语言中处理对象的方式有所不同。
ECMA-262中规定了对象:无数属性的集合,其属性可以包含基本值,对象或其他函数属性是与对象相关的值。
方法是能够在对象执行的动作。
案例一:

 var people=new Object();
    people.name="zhangsan";
    people.sex=18;
    people.say=function(){
        alert(people.name+" "+people.sex)
    }
    people.say();

我们还可以这么写:

 var people={
      name:"zhangsan",
      age:18,
      say:function(){
          alert(this.name)
      }
  }
people.say();

delete people.name——注意点1:我们可以使用delete删除对象的某一个属性。 举例生活中的对象

function people(name,age){
        this.name=name; 
        this.age=age;
        this.changeName=function(newName){
            this.name=newName;
        }
    }
    var zhangsan=new people("zhangsan",18);
    zhangsan.changeName("lisi");
    alert(zhangsan.name+" "+zhangsan.age)

---在类中通过this关键字添加的属性输入共有

创建对象——工厂模式

工厂模式抽象了创建具体对象的过程,考虑到ECMA无法创建类开发人员声明了一种函数,用函数封装了创建对象的细节。

 function createPeople(name,age,sex){
        var o=new Object();
        o.name=name;
        o.sex=sex;
        o.age=age;
    //
        o.say=function(){
    alert(this.name)
        }
        return o;
    }
    var zhangsan=createPeople("zhangsan",18,‘male‘);
    alert(zhangsan.name)

构造函数模式

构造函数——用于构造一个对象出来的函数
例如Object 和数组等等

function People(name,age,sex){  
       this.name=name;
       this,age=age;
       this.sex=sex;
       this.say=function(){
           alert(this.name)
       }
   }
    var zhangsan=new People("zhangsan",18,‘male‘)
    zhangsan.say();

在这个例子中和工厂模型的区别,直接将属性和方法赋值给了this对象,没有了return语句。
语法注意,构造函数开头字母不许大写,注意每个通过构造函数创建出来的对象都有一个constructor属性
构造函数也是函数,也可以当做参数传递。
http://uule.iteye.com/blog/1158829

call方法

语法:xxx.call([thisObj[,arg2[,argN]]]) 定义:调用一个对象的call方法,以另一个对象替换当前对象 说明:call方法可以用来代替另一个对象调用一个方法。call方法可将一个函数的对象上下文从初始的上下文改变成由thisObj指定的新对象。

 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,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 对象将被用作 thisObj, 并且无法被传递任何参数。

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

这是为什么呢? 因为每次都new新的方法导致了这个问题 解决方案:

 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)

这个还可以优化代码。

 

新手新人 如果不对之处请指正~!

面向对象

标签:

原文地址:http://www.cnblogs.com/yidian2ma/p/4749035.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!