在持久化对象引用和继承的同时组织原型javascript

Nim*_*ima 6 javascript oop javascript-objects

我使用JavaScript原型和继承构建了一个大型应用程序.但我很难组织我的代码.例如,我有一个类旋转木马,它有许多这样的功能:

Carousel.prototype.next = function () {...}
Carousel.prototype.prev = function () {..}
Carousel.prototype.bindControls = function () {..}
Run Code Online (Sandbox Code Playgroud)

我想像这样组织我的代码:

Carousel.prototype.controls = {
   next: function () { ... } , 
   prev: function() { ... },
   bindControls: function () { .. }
}
Run Code Online (Sandbox Code Playgroud)

但这会导致"这个"的价值丢失.我可以使用全局实例跟踪它但这会在继承类时导致问题例如在另一个文件中我有类似的东西来覆盖父类

BigCarousel.prototype.next = function () {...}
Run Code Online (Sandbox Code Playgroud)

我的继承是这样完成的:

Function.prototype.inheritsFrom = function (parentClass) {
    if (parentClass.constructor === Function) {
        //Normal Inheritance
        this.prototype              = $.extend(this.prototype , new parentClass);
        this.prototype.constructor  = this;
        this.prototype.parent       = parentClass.prototype;
    }
    else {
        //Pure Virtual Inheritance
        this.prototype = $.extend(this.prototype, parentClass);
        this.prototype.constructor = this;
        this.prototype.parent = parentClass;
    }
    return this;
};
Run Code Online (Sandbox Code Playgroud)

所以我可以这样做:

BigCarousel.inheritsFrom(Carousel)
Run Code Online (Sandbox Code Playgroud)

有谁知道我如何解决"这个"价值?

Hal*_*yon 2

你可以创建Controls一个自己的类:

var Controls = function (controllable_object) {
    this.ref = controllable_object;
};
Controls.prototype.next = function () {
    this.ref.foo();
}
// ..

var Carousel = function () {
    this.controls = new Controls(this);
};
// ..
Run Code Online (Sandbox Code Playgroud)

但这不允许您覆盖它的实现Controls。通过更多的依赖注入,你会得到类似的东西:

var Controls = function (controllable_object) {
    this.ref = controllable_object;
};
Controls.prototype.next = function () {
    this.ref.foo();
}
// ..

var Carousel = function () {
        this.controllers = [];
    };
Carousel.prototype.addController = function (controller) {
        this.controllers.push(controller);
    };
// ..

var carousel = new Carousel();
carousel.addController(new Controls(carousel));
Run Code Online (Sandbox Code Playgroud)