instanceof 运算符用来测试一个对象在其原型链中是否存在一个构造函数的 prototype 属性。
语法:object instanceof constructor
参数:object(要检测的对象.)constructor(某个构造函数)
描述:instanceof 运算符用来检测 constructor.prototype 是否存在于参数 object 的原型链上。
// 安全模式类
var Demo = function(){
if(!(this instanceof Demo)){
return new Demo();
};
this.info = '安全类';
};
Demo.prototype = {
name: '安全模式类'
};
// 测试
// 安全模式类,既可以使用new关键字来创建对象,也可以不使用new关键字来创建对象。
var d1 = Demo();
console.log(d1.info);
console.log(d1.name)
var d2 = new Demo();
console.log(d2.info)
console.log(d2.name);
/*
工厂方法模式--> 即 安全的工厂方法模式
*/
// 用安全模式创建的工厂类
var Factory = function(type,content){
if(this instanceof Factory){
var s = new this[type+'Ads'](content); // 关键点
return s;
}else{
return new Factory(type,content);
};
};
// 工厂原型中设置创建所有类型数据对象的基类
Factory.prototype = {
JavaAds: function(content){
this.content = content;
(function(content){ //自执行的业务逻辑
console.log(content);
})(content);
},
JavaScriptAds: function(content){
this.content = content;
(function(content){
console.log(content);
})(content);
},
UIAds: function(content){
this.content = content;
(function(content){
console.log(content);
})(content);
},
phpAds: function(content){
this.content = content;
(function(content){
console.log(content);
})(content);
},
PythonAds: function(content){
this.content = content;
(function(content){
console.log(content);
})(content);
}
};
// 测试
// 广告数据源
var data = [
{type:'JavaScript',content:'我是javascript广告2'},
{type:'Java',content:'我是Java广告'},
{type:'Php',content:'我是Php广告'},
{type:'UI',content:'我是UI广告'},
{type:'Python',content:'我是Python广告'},
{type:'JavaScript',content:'我是javascript广告2'}
];
// 一键处理广告
for(var i=data.length-1; i>=0; i--){
Factory(data[i].type, data[i].content); // 不加new,可以创建对象
new Factory(data[i].type, data[i].content); // 加new,也可以创建对象
};
工厂方法模式本意是将实际创建对象工作推迟到子类当中,这样核心类就成了抽象类(不能实例化),但是JavaScript没有像传统创建类那样的方式轻易创建抽象类,所以在JavaScript中实现工厂方法模式只需要参考其核心思想即可。可以将工厂方法看作是一个实例化对象的工厂类,安全起见,采用安全模式类,将创建对象的基类放在工厂方法类的原型中即可。