Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript `这个引用在原型链中丢失了_Javascript - Fatal编程技术网

Javascript `这个引用在原型链中丢失了

Javascript `这个引用在原型链中丢失了,javascript,Javascript,这是相当广泛的,但有趣和详细 我使用原型的标准JavaScript方式定义了以下两个“类”: 来源 AnalogCamerasSource扩展了源 现在,我需要一个AnalogCamerasSource的实例,我正在尝试创建它,简单如下: var data = {"sourceGuid":"{05A00E05-F30D-497D-A272-156F135E1486}","periodGuid":"{8A071454-B473-4937-9C54-4899F866D7FA}","eventName

这是相当广泛的,但有趣和详细

我使用原型的标准JavaScript方式定义了以下两个“类”:

来源 AnalogCamerasSource扩展了源 现在,我需要一个
AnalogCamerasSource
的实例,我正在尝试创建它,简单如下:

var data = {"sourceGuid":"{05A00E05-F30D-497D-A272-156F135E1486}","periodGuid":"{8A071454-B473-4937-9C54-4899F866D7FA}","eventName":"signal-lost","eventKind":3,"serverGuid":"{9976B57D-486B-4BCA-8432-78D7C8EDB52B}","cameraId":4,"waitingTime":5};

var c = new AnalogCamerasSource(data);
现在,行
this.\uuuu proto\uuuu.apply(this,arguments)
负责调用父级的构造函数,看起来它应该可以很好地完成,但在它应该调用父级构造函数中的父级函数时,会引发以下错误:

TypeError: this.sourceGuid is not a function
    at Function.Source (http://localhost:8081/js/app/events/model/0-Source.js:14:12)
    at AnalogCamerasSource (http://localhost:8081/js/app/events/model/AnalogCamerasSource.js:3:33)
现在,这里有一张Chrome调试器的图片,显示了属性在原型链的下方,在
this.\uuuu proto\uuuuu.prototype
下面,当像
this.\uuuuu proto\uuuu.apply(这个,参数)
那样调用时

那么,为什么this.sourceGuid不是一个函数呢?我应该如何调用父级的构造函数以使此链正常工作


这里有一个小问题:

我用这个解决方法解决了我的问题,如果有人能给出一个更正确的答案,我可以接受这是正确的答案:

我更改了原型定义:

AnalogCamerasSource.prototype = new Source();
然后,我将以下函数添加到
AnalogCamerasSource

AnalogCamerasSource.prototype.super = function() {
  Source.apply(this, arguments);
};
然后在构造函数中,我将其称为:

function AnalogCamerasSource() {
  this.super.apply(this, arguments);
  ...
};

工作起来就像一个符咒。

保持简单,像这样继承遗产:

AnalogCamerasSource.prototype = Source.prototype;
…然后在子类的构造函数中应用父类的构造函数函数:

function AnalogCamerasSource() {
  Source.apply(this, arguments);
  ...
}

通常不需要直接引用
\uuuu proto\uuuu

尝试更改
AnalogCamerasSource.prototype=Source
AnalogCamerasSource.prototype=新源和<代码>这个。_____;应用(这个,参数)
源代码。应用(这个,参数)

问题在于,您的方法
AnalogCameraSource.prototype
将设置为函数(源对象的构造函数),而不是对象。此函数本身没有在其原型上定义的方法。如果将
AnalogCameraSource.prototype
设置为新的源对象(使用
new Source
创建),则
AnalogCameraSource.prototype
是一个对象,这就是事情应该是什么样子。这会将源原型上定义的所有方法放在AnalogCameraSource的原型链中,并且源构造函数能够顺利运行。

重构了代码(避免在代码中使用
\uuuuuuuuuu

函数源(){
var args=参数[0]|{};
这是。_sourceGuid=args.sourceGuid | |“”;
这是._periodGuid=args.periodGuid | |“”;
这是._eventName=args.eventName | |“”;
这个._eventKind=args.eventKind | | 0;
};
Source.prototype.sourceGuid=函数(值){
如果(arguments.length>0){
这是._sourceGuid=value | |“”;
}否则{
返回此。\u sourceGuid;
}
};
Source.prototype.periodGuid=函数(值){
如果(arguments.length>0){
这是._periodGuid=值| |';
}否则{
返回此项。\u\guid;
}
};
Source.prototype.eventName=函数(值){
如果(arguments.length>0){
这是._eventName=value | |“”;
}否则{
返回此。\u eventName;
}
};
Source.prototype.eventKind=函数(值){
如果(arguments.length>0){
这个._eventKind=value | | 0;
}否则{
把这个还给我;
}
};
Source.prototype.toJSON=function(){
返回{
sourceGuid:this.sourceGuid(),
periodGuid:此。periodGuid(),
eventName:this.eventName(),
eventKind:this.eventKind()
};
};
函数AnalogCamerasSource(){
var args=参数[0]|{};
这是。_serverGuid=args.serverGuid | |“”;
这个。_cameraId=args.cameraId | | 0;
这是。_waitingTime=args.waitingTime | | 0;
此.sourceGuid(args.sourceGuid);
此.periodGuid(args.periodGuid);
this.eventName(args.eventName);
this.eventKind(args.eventKind);
};
AnalogCamerasSource.prototype=Object.create(Source.prototype);
AnalogCamerasSource.prototype.serverGuid=函数(值){
如果(arguments.length>0){
这是。_serverGuid=value | |“”;
}否则{
返回此。\u serverGuid;
}
};
AnalogCamerasSource.prototype.cameraId=函数(值){
如果(arguments.length>0){
这是| cameraId=value | | 0;
}否则{
把这个还给我;
}
};
AnalogCamerasSource.prototype.waitingTime=函数(值){
如果(arguments.length>0){
这是。_waitingTime=value | | 0;
}否则{
返回此。\u waitingTime;
}
};
AnalogCamerasSource.prototype.toJSON=函数(){
var json=Source.prototype.toJSON.call(this);
json.serverGuid=this.serverGuid();
json.cameraId=this.cameraId();
json.waitingTime=this.waitingTime();
返回json;
};
风险值数据={
“sourceGuid:“{05A00E05-F30D-497D-A272-156F135E1486}”,
“periodGuid:“{8A071454-B473-4937-9C54-4899F866D7FA}”,
“eventName”:“信号丢失”,
“事件种类”:3,
“服务器GUID”:“{9976B57D-486B-4BCA-8432-78D7C8EDB52B}”,
“cameraId”:4,
“等待时间”:5
};
var c=新的模拟源(数据);

控制台日志(c)继承应该类似于
AnalogCamerasSource.prototype=Object.create(Source.prototype)
AnalogCamerasSource.prototype=新源代码()是否有理由不使用es6类?如果您愿意,您可以随时传输到es5need@ajaiJothi然后我得到了这个错误:
TypeError:this.\uuu proto\uuuu.apply不是AnalogCamerasSource的函数
@它必须支持IE11,而且据测试,它只适用于Chrome、FIrefox和Edge。这是一个大项目,已经定义了系统和构建策略。我希望避免把它放在中间,但绝对可能。基本上和你的解决方案一样:)这个方法唯一的问题是:实际上,您必须调用构造函数来设置继承,这是不正确的
AnalogCamerasSource.prototype = Source.prototype;
function AnalogCamerasSource() {
  Source.apply(this, arguments);
  ...
}