javascript创建对象

Posted on 2017-07-20 11:24  浪去郎来  阅读(223)  评论(0)    收藏  举报

1、工厂模式:  用函数来封装以特定接口创建对象的细节

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("Nicholas",29,"Software Engineer");
var person2 = createPerson("Greg",27,"Doctor");

  注!:工厂模式虽然解决了创建多个相似对象的问题,但却没有解决对象识别的问题(既怎样知道一个对象的类型)

2、构造函数模式:

  function Person(name, age, job) {
        this.name = name;
        this.age = age;
        this.job = job;
        this.sayName = function () {
            alert(thisl.name);
        }
    }
    var person1 = new Person("Nicholas",29,"Software Engineer");
    var person2 = new Person("Greg",27,"Doctor");
//以这种方式定义的构造函数是定义在Global对象(在浏览器中是window对象)中的。

  与工厂模式的不同之处:

    1、没有显式的创建对象;

    2、直接将属性和方法付给了this对象;

    3、没有return语句。

此外函数名Person首字母大写。按照惯例,构造函数始终都应该以一个大写字母开头,而非构造函数则应该以一个小写字母开头;

  注!:

    1、构造函数本身也是函数,只不过可以用来创建对象而已;

    2、构造函数和其他函数的唯一区别,就在于调用他们的方式不同。任何函数,只要通过new操作符来调用,那它就可以作为构造函数,否则和其它函数没什么区别,例如

  //当作构造函数使用
    var person = new Person("Nicholas",29,"Software Engineer");
    person.sayName();   //"Nicholas
    
    //作为普通函数调用
    Person("Greg",27,"Doctor");     //添加到window
    window.sayName();       //“Greg”
    
    //在另一个对象的作用域中调用
    var o = new Object();
    Person.call(o,"Kristen",25,"Nurse");
    o.sayName();    //"Kristen"

3、原型模式

function Person() {
    }
    
    Person.prototype.name = "Nicholas";
    Person.prototype.age = 28;
    Person.prototype.job = "Software Engineer";
    Person.prototype.sayName = function () {
        alert(this.name);
    };
    
    var person1 = new Person();
    person1.sayName();      //Nicholas
    
    var person2 = new Person();
    person2.sayName();      //Nicholas
    
    alert(person1.sayName() == person2.sayName())       //true