创建一个对象通常用到的有两种方法:构造函数和字面量的方法。
var coder1 = new Object(); //构造函数
var coder2 = {}; //字面量的方法
好的,现在让我们想想怎么能使这样单调的代码变得酷起来,可以把创建函数的过程封装起来。
function createCoder (name, age) {
var coder = new Object( );
coder.name = name;
coder.age = age;
coder.whatJob = function () {
console.log('酷行者');
}
return coder;
}
这种方法有什么缺点呢?如果你脑中会出现这个问题那你的思想就是超酷的o.o!
缺点,创建的对象没有所属的类,都是单调的Object类
function createCoder(name, age) {
var coder = new Object();
coder.name = name;
coder.age = age;
coder.whatJob = function () {
console.log('酷行者')
}
return coder;
}
var coder = createCoder('聪聪',28);
var coder2 = createCoder('明明', 28);
coder instanceof Object; // true
coder2 instanceof Object; // true
构造函数就可以解决这个问题
function Coder(name, age) {
this.name = name;
this.age = age;
this.whatJob = function () {
console.log('酷行者');
}
}
var coder = new Coder('酷酷', 11);
coder instanceof Coder; //true
而这样的构造函数有什么缺点呢? Cool question.
缺点,每次创造一个新对象的时候,每个实例都会新建两个方法,而这两方法不是同一个Function 的实例,可以理解为如下的代码:
function Coder(name, age) {
this.name = name;
this.age = age;
this.whatJob = new Function ("console.log('酷行者');")
}
var coder = new Coder('酷酷',21);
var coder2 = new Coder('超酷',22);
coder.whatJob === coder2.whatJob; // false
可以怎样解决这样的问题呢?
方法一,把共有的方法放在全局下
function Coder(name, age) {
this.name = name;
this.age = age;
this.whatJob = whatJob;
}
function whatJob() {
console.log('酷行者');
}
var coder = new Coder('Cooler', 18);
var coder2 = new Coder('Jack', 18);
coder.whatJob === coder2.whatJob; //true
这样做的表明这个whatJob
函数只能被Coder
的实例调用,还得特意说明下,但是却放在全局作用域下面,这就自相矛盾了,还有就是一旦构造函数的方法多起来,都放在全局下,就更加乱套了。
为了解决这个问题原型模式出现了
function Coder (name, age) {
this.name = name;
this.age = age;
}
Coder.prototype.whatJob = function () {
console.log('酷行者');
}
coder.whatJob === coder2.whatJob; //true
原型模式有什么缺点呢?Cool question!It’s your turn.