标签:
工厂模式虽然解决了创建多个相似对象的问题,但没有解决对象识别问题.
function createPerson( name , age , job){ var o = new Object(); o.name = name; o.age = age; o.job = job; o.sayName = function(){ console.log( this.name ); } return o; } var person1 = createPerson(‘Alice‘,23,‘PHP Engineer‘); person1.sayName();
构造函数的特征:
function Person( name , age , job ){ this.name = name; this.age = age; this.job = job; this.sayName = function(){ console.log( this.name ); } } var person1 = new Person(‘Alice‘,23,‘PHP Engineer‘); person1.sayName();
构造函数与其他函数的唯一区别,就在于他们的调用方式不同.任何函数只要通过new来调用,那他就可以作为构造函数.
构造函数模式虽然好用,但构造函数内定义的方法要在每一个实例上重新创建一次.例如定义一个person1,person2,都有一个名为 sayName 的方法,但这个两方法不是同一个 Function 的实例.不同实例上的同名函数是不相等的.
console.log( person1.sayName == person2.sayName )
我们创建的每个函数都有一个原型属性,这个属性是一个指针,指向一个对象.而这个对象的用途是包含可以由特定类型的所有实例共享的属性和方法.
person = new Person(); Person.prototype = { constructor: ‘Person‘, name: ‘Haw‘, age: 31, job: ‘Software Engineer‘, sayName: function(){ console.log(this.name); } }; var person1 = new Person(); person1.name = ‘Sam‘
原型中的所有属性是被很多实例共享的,对于包含引用类型值的属性来说,就产生问题了.
function Person(){ } Person.prototype = { constructor: Person, name: ‘Michel‘, age: 25, job: ‘Software Engineer‘, friends: [‘Shelby‘,‘Court‘], sayName: function(){ console.log( this.name ); } }; var person1 = new Person(); var person2 = new Person(); person1.friends.push(‘Van‘); console.log( person2.friends ); ["Shelby", "Court", "Van"]
person1对friends数组的修改影响到了person2
创建自定义类型最常见的方式,就是组合使用构造函数模式和原型模式.
function Person( name , age , job ){ this.name = name; this.age = age; this.job = job; this.friends = []; } Person.prototype = { constructor: Person, sayName: function(){ console.log( this.name ); } } var person1 = new Person(‘Micholas‘,29,‘Software Engineer‘); var person2 = new Person(‘Greg‘,27,‘Doctor‘); person1.friends.push(‘Alice‘,‘Sam‘); person2.friends.push(‘Bob‘); console.log( person1.friends , person2.friends ); ["Alice", "Sam"] ["Bob"]
创建一个函数,这个函数的作用仅仅是封装创建对象代码,然后返回新创建的对象.
function Person( name , age , job ){ var o = new Object(); o.name = name; o.age = age; o.job = job; o.sayName = function(){ console.log(this.name); } return o; } var friend = new Person(‘Micholas‘,29,‘Software Engineer‘); friend.sayName();
除了使用new操作符并把使用的包装函数叫做构造函数之外,这个函数跟工厂模式其实是一模一样的.
function SpecialArray(){ var values = new Array(); values.push.apply( values , arguments ); values.toPipeString = function(){ return this.join("|"); }; return values; } var colors = new SpecialArray(‘red‘,‘blue‘,‘green‘); console.log( colors.toPipeString() ); red|blue|green
上例中,我们创建了一个具有特殊方法的数组,但是不能直接修改Array构造函数,因此同样使用了寄生构造模式. 关于寄生构造模式,返回的对象与构造函数或者与构造函数的原型属性没有关系.也就是说,构造函数返回的对象与 在构造函数外部创建的对象没有什么不同.为此不能依赖 instanceof 操作符来确定对象类型.
标签:
原文地址:http://www.cnblogs.com/yangke687/p/4272096.html