面向对象的程序设计(一)创建对象的各种方法

//1、创建对象
//缺点:创建很多个对象的时候会产生大量的代码
var person = new Object();
person.name = "Nicholas";
person.age = 24;
person.job = "码农";

person.sayName = function () {
    alert(this.name);
}

//2、工厂模式
//通过接收参数来构建一个包含所有必要信息的对象,节省了很多代码
//缺点,没有解决对象识别的问题(对象的类型)
function creatPerson(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 = creatPerson("Nicholas", 24, "码农");
var person2 = creatPerson("Greg", 24, "码农");

person1.sayName();//Nicholas
person2.sayName();//Greg

//3、构造函数模式
//和工厂模式不同的在于
//1、没有显示式的创建对象
//2、直接将属性和方法赋给了this对象
//3、没有reutrun语句
//缺点:构造函数的方法在每个实例上都要重新创建一遍
function Person(name, age, job) {
    this.name = name;
    this.age = age;
    this.job = job;

    this.sayName = function () {
        alert(this.name);
    }
}

var person3 = new Person("Nicholas", 24, "码农");
var person4 = new Person("Greg", 24, "码农");

person3.sayName();//Nicholas
person4.sayName();//Greg
alert(person3.sayName == person4.sayName);//false

//创建Person的新实例,必须使用new操作符。以这种方式调用构造函数实际上会经历以下4个步骤
//1、创建一个新对象
//2、姜构造函数的作用与赋给新对象(因此this就指向了这个新对象)
//3、执行构造函数中的代码(为这个新对象添加属性和方法)
//4、返回新对象
//每个实例都有一个constructor(构造函数)属性,该属性指向构造函数
alert(person3.constructor == Person);//true
alert(person4.constructor == Person);//true

//将构造函数当作一个普通函数来使用
Person("Tom", 27, "码农");
window.sayName();//Tom

var o = new Object();
Person.call(o, "Kittey", 25, "码农");//apply方法也可以
o.sayName();//Kittey

 

posted @ 2013-06-19 17:58  金帛  阅读(257)  评论(0编辑  收藏  举报