无法读取属性'原型'扩展类时未定义的

时间:2016-08-01 21:19:08

标签: javascript typescript

我遇到了扩展项目的问题,我得到了:

  

未捕获的TypeError:无法读取属性'原型'未定义的

从我所看到的内容中,需要按特定顺序定义项目,所以这就是我正在做的事情,因为看起来它们的顺序正确。

这不会在编译时发生,而是在运行时在浏览器中发生。我正在使用browserifytsify将文件编译为一个文件。

这是我的切入点 main.ts

import GameSmartWeb from './GameSmartWeb';
window.gs = new GameSmartWeb();

然后调用此文件 GameSmartWeb.ts 引用GUI类:

import GUI from './apis/GUI';
export default class GameSmartWeb {
    public get gui(): GUI { return new GUI(); }
}

然后GUI类 apis / GUI.ts 看起来有点像这样:

export default class GUI extends GameSmartWeb {
    public get rewards(): Rewards { return new Rewards(); }
}

class Rewards extends GUI {
    // More methods
}

在浏览器中查看错误时:

var __extends = (this && this.__extends) || function (d, b) {
    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
    function __() { this.constructor = d; }
    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); // The error is on this line
};
var GUI = (function (_super) {
    __extends(GUI, _super); // This is the call to the function
    // more auto generated code
});

6 个答案:

答案 0 :(得分:7)

今天发生在我身上,虽然它似乎与你没有相同的原因。无论如何,我正在为将来来这里的其他人写一个答案。

我的文件设置如下:

<强> item.ts

export class Item {
    myAwesomeFunction() {
        ...
    }
}

index.ts (能够顺利引用):

...
export * from './item';
...

<强> other.item.ts

import { ..., Item, ... } from './index';

export class OtherItem extends Item ... {
    ...
}

这导致了我的错误:

  

无法读取未定义的属性'prototype'

other.item.ts 更改为以下内容后,工作正常:

import { ... } from './index';
import { Item } from './item';

export class OtherItem extends Item ... {
    ...
}

答案 1 :(得分:3)

我有同样的问题。在我的例子中,bundle配置文件中的类文件的顺序就是它的原因。我在基类之前指定了派生类的文件,切换顺序,修复它。

答案 2 :(得分:2)

问题是因为在我的编译器中,文件的顺序是错误的。以正确的顺序排序文件时,错误就会消失,JavaScript也会起作用。

因此,编译器中的顺序应如下所示:

'GameSmartWeb',
'GUI'

答案 3 :(得分:0)

对我来说,奇怪的是,我试图通过node_modules包(angular-dual-listbox)扩展我通过webpack导入的组件,当我使用“from'angle-dual-listbox'”导入它时,它失败了以上的消息。当我从'angular-dual-listbox / index'导入时,中提琴!

答案 4 :(得分:0)

就我而言,我正在使用browserify。

  1. 浏览文件路径:browserify / bundle.js
  2. Client.js文件路径:public / js / client.js
  3. 导入文件路径:app.js

因此,当我导入bundle.js时,app.js的文件路径会有所不同,然后从client.js加载(因为我正在对client.js进行更改,然后将其转换为bundle.js)

答案 5 :(得分:0)

我的原因是没有在其中一个类中调用super()。您可以检查每个构造函数是否调用了super。