1. 工厂模式
function createPerson(name, age) { var obj = new Object(); obj.name = name; obj.age = age; obj.say = function() { alert(this.name); }; return obj; } var p1 = createPerson('shadow', 23); p1.say();
2.1 使用new调用
function Person(name, age) { this.name = name; this.age = age; this.say = function() { alert(this.name); }; } var p1 = new Person('shaow', 23); p1.say();
2.2 不使用new调用
Person('shadow', 21); window.say();
2.3 在另一对象的作用域中调用
var o = new Object(); Person.call(o, 'shadow', 24); o.say();
3.原型模式
3.1 可以通过对象实例保存原型中的值,但不能通过对象实例重写原型中的值
function Person() { } Person.prototype.name = "prototype val"; var p1 = new Person(); var p2 = new Person(); p1.name = "object val"; alert(p1.name);//prototype val alert(p2.name);//object val
当为对象添加属性时,只会屏蔽调原型对象中的相同属性,不会修改原型对象中的属性
3.2 可以使用delete删除实例属性
function Person() { } Person.prototype.name = "prototype val"; var p1 = new Person(); var p2 = new Person(); p1.name = "object val"; delete p1.name; alert(p1.name);//prototype val alert(p2.name);//prototype val
3.3 使用hasOwnProperty方法可以检测一个属性是存在于实例中还是原型中
function Person() { } Person.prototype.name = "prototype val"; var p1 = new Person(); var p2 = new Person(); p1.name = "object val"; alert(p1.hasOwnProperty("name"));//true delete p1.name; alert(p1.hasOwnProperty("name"));//false
4.组合使用构造模式和原型模式(默认定义引用类型的模式)
function Person(name){ this.name = name; this.friends = ["shadow", "parsons"]; }Person.prototype = { constructor: Person, say: function(){ alert(this.name); } };var person1 = new Person();//此时Person var person2 = new Person(); person1.friends.push("james"); alert(person1.friends);//[shadow, parsons, james] alert(person2.friends);//[shadow, parsons] alert(person1.friends == person2.friends);//false alert(person1.say == person2.say);//true构造函数用于构造实例属性,原型模式用于构造方法和共享属性