1、工厂模式
ex:
function createPerson( name, age, job) {
var o = new Object() ;
o.name = name;
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、构造函数模式
ex:
function Person(name, age, job) {
this.name = name;
this.age = age;
this.job = job;
this.sayName = function() {
alert(this.name);
};
} var person1 = new Person("Nicholas" , 29, "Software Engineer");
var person2 = new Person("Greg", 27, "Doctor");
作为一个构造函数,创建一个新对象,将构造函数的作用域赋给新对象,执行构造函数中的代码,添加属性和方法,返回新对象。
这样坏处在于同一个方法函数做的同一件事情需要产生多个不同或不相等的函数。
3、原型模式
function Person() {
} Person.prototype.name = "Nicholas";
Person.prototype.age = 29;
Person.prototype.job = "Software Engineer";
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
所有实例共享原型的属性和方法
原型对象理解:
prototype的constructor属性指向新的构建函数
构建函数的prototype属性指向原型Prototype
new的新对象的[[Prototype]]属性指向原型Prototype
Person.prototype.isPrototypeOf(person1) //true
Person.prototype.isPrototypeOf(person2) //true
Object.getPrototypeOf(person1) == Person.prototype
Object.getPrototypeOf(person1).name //access
这里的访问先访问对象有否此属性,若无,再访问原型有否该属性,再访问更上层的原型,诸如此类。
hasOwnProperty 可以检测一个属性是存在于实例中,还是存在于原型中,这个方法只在给定属性存在于对象实例中的时候,才会返回true