<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>面向对象</title>
</head>
<body>
    一:创建对象
        1.Object构造函数或对象字面量创建单个对象
        2.工厂模式:(用函数来封装特定接口创建对象的细节)
        3.构造函数:
        4.原型模式:
        5.组合模式(最常用*)
        6.动态原型模式
        7.寄生构造函数模式

</body>
<script type="text/javascript">
    // 工厂模式
    function createPerson(name,age,job) {
        var o = new Object();
        o.name = name;
        o.age = age;
        o.job = job;
        o.sayName = function(){
            alert(this.name);
        }
        return o;
    }
    var person1 = createPerson("leo",29,"doctor");
    var person2 = createPerson("jack",28,'teacher');
    // 缺点:函数createPerson()能够创建根据接受的参数来构建一个包含所有必要信息的     Person对象。
   //可以无数次的调用这个函数,而每次他都会返回三个属性和一个方法的对象。
   //工厂模式虽然解决了创建多个相同对象的问题,但却没有解决对象识别的问题!!!(不懂什么意思)


    // 构造函数模式
    function Person(name,age,job){
        this.name = name;
        this.age = age;
        this.job = job;
        this.sayName = function(){
            alert(this.name);
        }
    }
    var person1 = new Person("leo",29,"doctor");
    var person2 = new Person("jack",28,'teacher');
    // 优点:创建自定义构造函数意味着将来我们可以将他的实例标识为一种特定的类型,
    //而这正是构造函数模式胜过工厂模式的地方
    // 缺点:就是每个方法都要在每个实例上创建一遍,在前面的例子中person1,person2都有一个同样的sayName方法,等于创建了两次相同的sayName方法

    
    //原型模式
    function Person(){

    }
    Person.prototype.name = 'leo';
    Person.prototype.age = 29;
    Person.prototype.job = 'doctor';
    Person.prototype.sayName = function(){
        alert(this.name);
    }
    var person1 = new Person();
    person1.sayName();  // leo
    var person2 = new Person();
    person2.sayName();  //  leo
    alert(person1.sayName == person2.sayName);  //true 
    // 优点:可以让所有的对象实例共享它所包含的所有属性和方法,
    //换句话说不必在构造函数中定义对象实例的信息,而是可以将这些信息直接添加到原型对象中
    // 缺点:省略掉了为构造函数传递初始化参数的步骤,使得所有实例在默认情况下都取得相同的属性值
          // 属性共享

    // 组合模式  
    // 使用构造函数模式和原型模式,构造函数定义实例属性,原型定义方法和共享属性
    function Person(name,age,job){
        this.name = name;
        this.age = age;
        this.job = job;
    }
    Person.prototype = {
        constructor:Person,  // 对象字面量形式会使constructor属性重写,所以要重新赋值
        sayName:function(){
            alert(this.name);
        }
    }

</script>
</html>

大桔子
588 声望51 粉丝

下一步该干什么呢...