ECMAScriptjavascript各种模式解析

1、工厂模式;

厂子模式是软件工程领域同样种植广为人知的设计模式,这种模式抽象了创建具体对象的过程(后面还用讨论其他设计模式及其在JavaScript
中的贯彻)。考虑到以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 jone = createPerson('jone', 28, 'teacher');
jone.sayName() // jone

函数createPerson()能够基于接受之参数来构建一个带有有必要信息之Person
对象。可以多不成地调用这个函数,而每次她都见面返回一个分包三单特性一个方法的目标。工厂模式则缓解了创造多独一般对象的问题,但却无缓解对象识别的问题(即什么理解一个目标的类型)。随着JavaScript的上进,又一个新模式出现了。

2、构造函数模式

ECMAScript 中的构造函数可用来创造特定项目的目标。像Object 和Array 这样

的原生构造函数,在运行时会见活动出现在履行环境被。此外,也得创造于定义之构造函数,从而定义自定义对象类型的性与章程。例如,可以行使构造函数模式将前的事例重写如下。

function Person(name, age, job) {
    this.name = name;
    this.age = age;
    this.job = job;
    this.sayName = function() {
        alert(this.name);
    };
}
var jone = new Person("jone", 29, "teacher");

3、原型模式

我们创建的每个函数都产生一个prototype(原型)属性,这个特性是一个指南针,指向一个对象,而之目标的用途是富含可以由特定项目的兼具实例共享的性质和措施。如果按照字面意思来理解,那么prototype
就是经调用构造函数而创造的充分目标实例的原型对象。使用原型对象的好处是足以于抱有目标实例共享它所涵盖的性质和法。换句话说,不必在构造函数中定义对象实例的消息,而是可以将这些消息一直助长到原型对象被,如下面的例子所示。

var Person = function() {

}
Person.prototype.name = 'jone';
Person.prototype.age = 28;
Person.prototype.job = 'teacher';
Person.prototype.sayName = function() {
    alert(this.name)
}
var person1 = new Person();
person1.sayName();
var person2 = new Person();
person2.sayName();
alert(person1.sayName == person2.sayName); //true

于这,我们用sayName()方法及颇具属性直接长到了Person 的prototype
属性中,构造函数变成了空函数。即使这样,也照例可通过调用构造函数来创造新目标,而且新对象还会有相同之属性与方法。但和构造函数模式不同的凡,新目标的这些性与章程是由于所有实例共享的。换句话说,person1
和person2 访问的都是如出一辙组属性和与一个sayName()函数。 

alert(Person.prototype.isPrototypeOf(person1)); //true
alert(Person.prototype.isPrototypeOf(person2)); //true

足下hasOwnProperty()方法可检测一个性质是在被实例中,还是存在于原型中。见下面例子;

var Person = function() {

}
Person.prototype.name = 'jone';
Person.prototype.age = 28;
Person.prototype.job = 'teacher';
Person.prototype.sayName = function() {
    alert(this.name)
}
var person1 = new Person();
person1.sayName();
var person2 = new Person();
person2.sayName();


alert(person1.hasOwnProperty('name')) // false;

person1.name = "Greg";
alert(person1.name); //"Greg" ——来自实例
alert(person1.hasOwnProperty("name")); //true

通过下hasOwnProperty()方法,什么时看的是实例属性,什么时候访问的凡原型属性就清清楚楚了。调用person1.hasOwnProperty(
“name”)时,只有当person1 重写name 属性后才见面回来true,因为只有这候name
才是一个实例属性,而无原型属性。

于前的例子中,读者大概注意到了,前面例子中列添加一个性和办法就使讹一全Person.prototype。为减少非必要之输入,也以从视觉上再度好地卷入原型的效用,更广泛的做法是因此一个含有属性与艺术的靶子字面量来更写满原型对象,如下面的例子所示。

function Person() {

}
Person.prototype = {
    name: "Nicholas",
    age: 29,
    job: "Software Engineer",
    sayName: function() {
        alert(this.name);
    }
};

var friend = new Person();
alert(friend instanceof Object); //true
alert(friend instanceof Person); //true
alert(friend.constructor == Person); //false
alert(friend.constructor == Object); //true