一. 使用new Object()创建


//使用object创建一个对象    完全等同于 var person = {};
var person = new Object();
//给对象添加属性
person.name = "李四";
//给对象添加方法
person.eat = function () {
alert("好好吃")
}

二. 工厂模式创建

虽然 Object 构造函数或对象字面量都可以用来创建单个对象,但这些方式有个明显的缺点:使用同一个接口创建很多对象,会产生大量的重复代码。

为解决这个问题,人们开始使用工厂模式的一种变体。

工厂模式是软件工程领域一种广为人知的设计模式,

这种模式抽象了创建具体对象的过程,考虑到在 ECMAScript 中无法创建类,

开发人员就发明了一种函数,用函数来封装以特定接口创建对象的细节。

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("张三", 29, "js开发者");
var person2 = createPerson("李四", 27, "java开发者");

createPerson()函数可以多次调用,

每调用一次这个函数就会返回一个对象,而且对象的类型仍然是Object类型的。

虽然解决了多个相似对象的问题,但却没有解决对象类型识别的问题。


三. 构造函数模式创建对象

为了解决对象类型识别问题,又提出了构造函数模式。

这种模式,其实在我们创建一些原生对象的时候,比如Array、Object都是调用的他们的构造函数。

看下面的代码


<script type="text/javascript">
    function Person (name, age, sex) {
        this.name = name;

        this.age = age;
        this.sex = sex;

        this.eat = function () {
            alert(this.name + "在吃东西");
        }
    }
    var p1 = new Person("张三", 20, "男");
    p1.eat();    //张三在在吃东西
    var p1 = new Person("李四", 30, "男");
    p1.eat();    //李四在在吃东西
    alert(p1 instanceof Person);    //
</script>

说明:

  1. 使用构造函数创建对象,必须使用关键字new ,后面跟着构造函数的名,根据需要传入相应的参数。

  2. 其实使用 new 构造函数() 的方式创建对象,经历了下面几个步骤。

    • 创建出来一个新的对象

    • 将构造函数的作用域赋给新对象。意味着这个时候 this就代表了这个新对象

    • 执行构造函数中的代码。 在本例中就是给新对象添加属性,并给属性初始化值。

    • 构造函数执行完毕之后,默认返回新对象。 所以外面就可以拿到这个刚刚创建的新对象了。


四. 构造函数和普通函数的关系

  1. 他们都是函数。

    构造函数也是函数,也可以像普通的函数一样进行调用。

    做普通函数调用的时候,因为没有创建新的对象,所以this其实指向了window对象。

     function Person(){
           this.name = "张三";    // 把name属性添加到了window对象上面
           alert(this === window);  //如果不作为构造方法调用,则 是true
     }
     Person();  // 把构造函数当做普通方法调用。这个时候内部的this指向了weindow
     alert(window.name);  //张三
     function Human(){
           this.name = "王五";
           alert(this instanceof window);  // false
           alert(this instanceof Human);  //true
     }
     var h = new Human();  //当做构造函数来调用,创建一个对象
     alert(h.name);
    
  2. 构造函数和普通函数仅仅也仅仅是调用方式的不同。

    也就是说,随便一个函数你如果用new 的方式去使用,那么他就是一个构造函数。

  3. 为了区别,如果一个函数想作为构造函数,作为国际惯例,最好把这个构造函数的首字母大写。

Copyright © 李振超 2018 all right reserved,powered by Gitbook
该文件最后修订时间: 2018-10-18 03:19:29

results matching ""

    No results matching ""