javascript继承(二)—创建对象的三种模式
一、工厂模式
function createPerson(name,age){ var o = {}; o.name = name; o.age = age; o.sayHi = function(){ alert('my name is' + this.name); }; return o; } var p1 = createPerson('小明',10); var p2 = createPerson('小红',9); p1.sayHi(); p2.sayHi(); console.log(p1.constructor); //Object console.log(p2.constructor); //Object
工厂模式可以创建多个对象,但是并不知道对象的类型,因为都指向了Object
二、构造函数模式
function Person(name,age){ this.name = name; this.age = age; this.sayHi = function(){ alert('my name is' + this.name); }; } var p1 = new Person('小明',10); var p2 = new Person('小红',9); p1.sayHi(); p2.sayHi(); console.log(p1.constructor); //Person(name,age) console.log(p2.constructor); //Person(name,age) console.log(p1.sayHi==p2.sayHi);//false
p1的sayHi方法和p2的sayHi方法是不同的,说明每new一个对象就会创建一个sayHi方法,其实这完全没必要,也会浪费空间。
当然代码可以改写如下:
function Person(name,age){ this.name = name; this.age = age; this.sayHi = sayHi; } function sayHi(){ alert('my name is' + this.name); } var p1 = new Person('小明',10); var p2 = new Person('小红',9); p1.sayHi(); p2.sayHi(); console.log(p1.constructor); //Person(name,age) console.log(p2.constructor); //Person(name,age) console.log(p1.sayHi==p2.sayHi);//true
这时它们方法所指向的代码块就相同,即共用了一个方法。但其实没有必要为了一个类的特权方法就创建一个全局的方法,也会使得这个类显得比较凌乱。
第三、原型链模式
function Person(name,age){ this.name = name; this.age = age; } Person.prototype.sayHi =function(){ alert('my name is' + this.name); } var p1 = new Person('小明',10); var p2 = new Person('小红',9); p1.sayHi(); p2.sayHi(); console.log(p1.constructor); //Person(name,age) console.log(p2.constructor); //Person(name,age) console.log(p1.sayHi==p2.sayHi);//true
对于原型链来创建对象,可以看到对象引用的方法是同一个方法,即类的共有方法。这样极大的节约了代码空间,不会每new一个对象就就类的所有方法创建一遍。
对于对象的特权属性、方法和共有属性、方法在javascript中类的属性研究 这篇文章中有所介绍。