js面向对象-单体对象-工厂模式
单体对象
var tom = {
name :'tom',
age:18,
showname:function(){
alert(this.name)
}
showage:function(){
alert(this.age)
}
}
属性 和方法都必须用 ,分开。注意showname 和showage之间都有分号.对象里边完全是一个字典的形式。
手动创建了一个对象,在创建一个对象就再写一遍,累。
试试工厂模式
工厂模式
var Tom = new Object();
Tom.name = 'tom';
Tom.age = 18;
Tom.showage = function(){
alert(this.age)
}
alert(Tom.showage());
相比于字典模式这中对象的创建是先创建一个空对象。添加属性name和方法等。这个都是相当于绑定到变量。
采用工厂模式快速创建对象
function Person(name,age,job){
var o = new Object();
o.name = name;
o.age = age;
o.job = job;
o.showname = function(){
alert(this.name);
}
o.showage = function(){
alert(this.age);
}
o.showjob = function(){
alert(this.job);
}
return o;
}
创建一个对象
var Tom = Person('tom',18,'全栈');
Tom.showjob();
var Jack = Person('jack',19,'销售');
Jack.showjob();
调用alert(Tom.showjob == Jack.showjob)
返回False
缺点方法都是自己的,就好像功能一样但是,具体不是一个人,浪费了空间,可以使用其他方式共享方法.
构造函数
function Person(name,age,job){
this.name = name;
this.age = age;
this.job = job;
this.showname = function(){
alert(this.name);
}
this.showage = function(){
alert(this.age);
}
this.showjob = function(){
alert(this.job);
}
}
调用相当于利用构造方式初始化了属性。
实例化对象
var Tom = new Person('tom',18,'全栈')
Tom.showage();
var Jack = new Person('jack',28,'美工')
Jack.showage();
如果不用new创建对象,不加new关键字,没法调用Jack.showage等一系列方法。这样的创建方式方法也是独立的alert(Tom.showage == Jack.showage);
也是False
共享方法
方法或者属性加上prototype关键字,对象就共享了这个数据或者方法。
function Person(){
}
Person.prototype.name = 'tom';
Person.prototype.age = '18';
var tom = new Person();
var jack = new Person();
alert(tom.name);
alert(jack.name);
这里的tom.name = jack.name = ‘tom’
所以不同的属性应该放到里边内部属性中.
function Person(){
}
Person.prototype.name = 'tom';
Person.prototype.age = '18';
var tom = new Person();
var jack = new Person();
alert(tom.name);
以上代码可以改写为
function Person(name,age){
this.name = name;
this.age = age;
}
Person.prototype.showname = function(){
alert(this.name);
}
Person.prototype.showage = function(){
alert(this.age);
}
var tom = new Person('tom',20);
var jack = new Person('jack',18);
alert(tom.name);
alert(tom.showage == jack.showage);
最后的值是返回true,也就共享了方法。