貌似老師的代碼錯了,有哪位大神糾正下
!function(global){
function?DetectorBase(configs){
if?(!this?instanceof?DetectorBase)?{
throw?new?Error('Do?not?invoke?without?new.')
???}
???this.configs=configs;
???this.analyze();??
}
}(this);
DetectorBase.prototype.detect?=?function()?{
throw?new?Error('Not?implemented')
};
DetectorBase.prototype.analyze=function(){
console.log('Analyzing...')
this.data="##data##"
};
function?LinkDetector(links){
if?(!this?instanceof?LinkDetector)?{
throw?new?Error('Do?not?invoke?without?new.')
}
this.links=links;
DetectorBase.apply(this,arguments);
}
function?ContainerDetector(containers){
if?(!this?instanceof?ContainerDetector)?{
throw?new?Error('Do?not?invoke?without?new.')
}
this.containers=containers;
DetectorBase.apply(this,arguments);
}
function?inherit(subClass,superClass){
subClass.prototype=Object.create(superClass.prototype)
subClass.prototype.constructor=subClass;
}
inherit(LinkDetector,DetectorBase);
inherit(ContainerDetector,DetectorBase);
LinkDetector.prototype.detect=function(){
console.log('Loading?data:'+this.data);
console.log('link?detection?started.');
console.log('Scaning?link:'+this.links);
};
ContainerDetector.prototype.detect=function(){
console.log('Loading?data:'+this.data);
console.log('Container?detection?started.');
console.log('Scaning?containers:'+this.containers);
}
Object.defineProperties(global,{
LinkDetector:{value:LinkDetector},
ContainerDetector:{value:ContainerDetector},
DetectorBase:{value:DetectorBase}
});
var?a=new?ContainerDetector('#abc');
var?b=new?LinkDetector('http://www.baidu.com')
a.detect;
b.detect;VM25187:11 Uncaught ReferenceError: DetectorBase is not defined
2016-04-27
/** ?*?Created?by?wz?on?16/4/27. ?*/ ? ?//這樣應該可以了 var?Detec=(function(global){ ????return{ ????????cons:function?DetectorBase(configs){ ????????????if?(!this?instanceof?DetectorBase)?{ ????????????????throw?new?Error('Do?not?invoke?without?new.') ????????????} ????????????this.configs=configs; ????????????this.analyze(); ????????} ????} })(this); Detec.cons.prototype.analyze=function(){ ????console.log('Analyzing...'); ????this.data="##data##"; }; Detec.cons.prototype.detect=function?()?{ ????throw?new?Error('Not?implemented'); }; function?LinkDetector(links){ ????if?(!this?instanceof?LinkDetector)?{ ????????throw?new?Error('Do?not?invoke?without?new.') ????} ????this.links=links; ????Detec.cons.apply(this,arguments); } function?ContainerDetector(containers){ ????if?(!this?instanceof?ContainerDetector)?{ ????????throw?new?Error('Do?not?invoke?without?new.') ????} ????this.containers=containers; ????Detec.cons.apply(this,arguments); } function?inherit(subClass,superClass){ ????subClass.prototype=Object.create(superClass.prototype); ????subClass.prototype.cons=subClass; } inherit(LinkDetector,Detec.cons); inherit(ContainerDetector,Detec.cons); LinkDetector.prototype.detect=function(){ ????//console.log(this); ????//alert(this?instanceof?LinkDetector); ????console.log('Loading?data:'+this.data); ????console.log('link?detection?started.'); ????console.log('Scaning?link:'+this.links); }; ContainerDetector.prototype.detect=function(){ ????console.log('Loading?data:'+this.data); ????console.log('Container?detection?started.'); ????console.log('Scaning?containers:'+this.containers); }; Object.defineProperties(this,{ ????LinkDetector:{value:LinkDetector}, ????ContainerDetector:{value:ContainerDetector}, ????DetectorBase:{value:Detec.cons} }); var?a=new?ContainerDetector('#abc'); var?b=new?LinkDetector('http://www.baidu.com'); a.detect(); b.detect();2016-09-11
我這個也可以的,不用怎么改老師的代碼
!function(global){
????function?DetectorBase(configs){
if?(!this?instanceof?DetectorBase)?{
????throw?new?Error('Do?not?invoke?without?new.')
???}
???this.configs=configs;
???this.analyze();??
????}
window["DetectorBase"]=DetectorBase;
}(this);
DetectorBase.prototype.detect?=?function()?{
????throw?new?Error('Not?implemented')
};
DetectorBase.prototype.analyze=function(){
????console.log('Analyzing...')
????this.data="##data##"
};
function?LinkDetector(links){
????if?(!this?instanceof?LinkDetector)?{
????????throw?new?Error('Do?not?invoke?without?new.')
????}
????this.links=links;
????DetectorBase.apply(this,arguments);
}
function?ContainerDetector(containers){
????if?(!this?instanceof?ContainerDetector)?{
????????throw?new?Error('Do?not?invoke?without?new.')
????}
????this.containers=containers;
????DetectorBase.apply(this,arguments);
}
function?inherit(subClass,superClass){
subClass.prototype=Object.create(superClass.prototype)
subClass.prototype.constructor=subClass;
}
inherit(LinkDetector,DetectorBase);
inherit(ContainerDetector,DetectorBase);
LinkDetector.prototype.detect=function(){
????console.log('Loading?data:'+this.data);
????console.log('link?detection?started.');
????console.log('Scaning?link:'+this.links);
};
ContainerDetector.prototype.detect=function(){
????console.log('Loading?data:'+this.data);
????console.log('Container?detection?started.');
????console.log('Scaning?containers:'+this.containers);
}
Object.defineProperties(this,{
LinkDetector:{value:LinkDetector},
ContainerDetector:{value:ContainerDetector},
DetectorBase:{value:DetectorBase}
});
var?a=new?ContainerDetector('#abc');
var?b=new?LinkDetector('http://www.baidu.com')
a.detect();
b.detect();
2016-08-06
你代碼里匿名函數的花括號結束地點錯啦,應該在這之后才對,要把所有的函數聲明都包含在函數體內,這樣才能調用定義的DetectorBase,否則會說DetectorBase是undefined的
下面這樣就可以運行了
!function(global){ //用函數包裹以防止基類的變量和函數在外部被更改
function DetectorBase(config)
{
if(!this instanceof DetectorBase){
throw new Error("Do't invoke without new.");
}
this.config = config;
this.analyze();
}
DetectorBase.prototype.detect = function(){
throw new Error("not implemented");
}
DetectorBase.prototype.analyze = function(){
console.log("analyzing...");
this.data = "###data###";
}
function LinkDetector(links){
if(!this instanceof LinkDetector){
throw new Error ("Don't invoke without new.");
}
this.links=links;
DetectorBase.call(this,arguments[1]);
}
function ContainerDetector(containers){
if(!this instanceof ContainerDetector){
throw new Error ("Don't invoke without new.");
}
this.containers=containers;
DetectorBase.call(this,arguments[1]);
}
//inherit obj
inherit(LinkDetector,DetectorBase);
inherit(ContainerDetector,DetectorBase);
function inherit(subClass,superClass){
subClass.prototype = Object.create(superClass.prototype);
subClass.prototype.constructor = subClass;
}
//expand child class
LinkDetector.prototype.detect = function(){
console.log("Loading data:"+this.data);
console.log("Link detection started.");
console.log("Scaning links:"+this.links);
}
ContainerDetector.prototype.detect = function(){
console.log("Loading data:"+this.data);
console.log("container detection started.");
console.log("Scaning containers:"+this.containers);
}
//prevent from being altered
Object.freeze(DetectorBase);
Object.freeze(DetectorBase.prototype);
Object.freeze(LinkDetector);
Object.freeze(LinkDetector.prototype);
Object.freeze(ContainerDetector);
Object.freeze(ContainerDetector.prototype);
//export to global object 可以將這些類添加到global對象(對瀏覽器來說為window對象)同時防止其被更改
Object.defineProperties(global,{
LinkDetector:{value:LinkDetector},
ContainerDetector:{value:ContainerDetector},
DetectorBase:{value:ContainerDetector}
});
}(this);
var cd = new ContainerDetector("#abc","#def","#ghi");
var ld = new LinkDetector("
cd.detect();
ld.detect();