示例一:
var Demo = function () { }; Demo.prototype = { show: function () { alert('show'); } } var d = new Demo(); d.show();//执行成功 var d = Demo(); d.show();//执行失败
上面执行失败的原因:
在构造函数开始执行时,先判断当前对象this指代是不是当前类(Demo),如果是则通过new关键字创建对象,如果不是,则说明this指向的是window,而window对象中并没有show函数,所以调用失败!
解决方法:在当this指向window对象的时候,再重新返回新创建的对象。示例如下:
var Demo = function () { if(!(this instanceof Demo)){ return new Demo(); } }
示例二:安全的工厂方法
//安全模式创建的工厂类 var Factory = function (type, content) { if (this instanceof Factory) { alert('ok'); return new this[type](content); } else { alert('no'); return new Factory(type,content); } } //工厂原型中设置创建所有类型数据对象的基类 Factory.prototype = { Java: function (content) { alert('i am ' + content); }, JS: function (content) { alert('i am ' + content); }, PHP: function (content) { alert('i am ' + content); } }; var data = [ {type:"JS",content:"JJS"}, {type:"PHP",content:"PHPP"}, {type:"Java",content:"JAVA"} ]; for (var i = 0; i < data.length; i++) { Factory(data[i].type,data[i].content); }