JavaScript继承或这是如何工作的?

arb*_*arb 5 javascript oop knockout.js

我试图在JavaScript中实现一定程度的继承,这是我到目前为止所拥有的:

function Address() {
    this.address1 = ko.observable();
    this.address2 = ko.observable();
    this.country = ko.observableSafe(null, new Country(-1, '', false));
    this.city = ko.observable('');
    this.state = ko.observable();
    this.province = ko.observable('');
    this.zipCode = ko.observable();

    this.countryLookupID = '';
    this.stateLookupID = '';

    ko.computed(function () {
        var newCountry = this.country();
        if (newCountry) {
            this.countryLookupID = newCountry.id.toString();
            if (newCountry.international) {
                this.clearDomestic();
            }
            else {
                this.clearInternational();
            }
        }
        else {
            this.countryLookupID = "";


    }, this);
    ko.computed(function () {
        var newState = this.state();
        if (newState) {
            this.stateLookupID = newState.id.toString();
        }
        else {
            this.stateLookupID = "";
        }
    }, this);
}
Address.prototype.clearDomestic = function () { return true; };
Address.prototype.clearInternational = function () { return true; };

function Company() {
    this.base = Address;
    this.base(this);
    this.legalEntityID = ko.observable(0);
    this.legalEntityName = ko.observable('');
    this.isFemaleOwned = ko.observable(false);
    this.isMinorityOwned = ko.observable(false);
    this.webAddress = ko.observable();

    this.businessPhone = ko.observable();
    this.faxNumber = ko.observable();

    this.locked = ko.observable(false);

}
Company.prototype.constructor = Address;
Company.prototype.clearDomestic = function () {
    this.businessPhone('');
    this.state(null);
    this.zipCode('');
};
Company.prototype.clearInternational = function () {
    this.province('');
};
Run Code Online (Sandbox Code Playgroud)

如果您不熟悉Knockout框架,那就没关系,因为它可能与此讨论无关.在我看过的任何地方,我都没有看到完全像这样的继承.就目前而言,这正是您认为应该如何运作的.当clearDomestic()被调用时,函数的正确版本被称为在继承类和this指向一个Company对象.如果我取出base并打电话base(this),它会中断.

任何人都可以解释为什么这有效吗?如果这是一个不好的做法,有人可以告诉我如何重写它,所以它的功能相同吗?我真的不想包含另一个库来实现这一目标.

UPDATE

如果Addressthis.clearDomestic()在内部调用ko.computed,它会尝试调用clearDomestic()附加的,Company但然后this指向一个Address对象,因此businessPhone不再定义.

更新2

我又把事情搞砸了,我已经确定了这个方法.它并不理想,但它是始终如一的唯一方式.

function Address() {
    this.address1 = ko.observable();
    this.address2 = ko.observable();
    this.country = ko.observableSafe(null, new Country(-1, '', false));
    this.city = ko.observable('');
    this.state = ko.observable();
    this.province = ko.observable('');
    this.zipCode = ko.observable();

    this.countryLookupID = '';
    this.stateLookupID = '';
}
Address.prototype.clearDomestic = function () { return true; };
Address.prototype.clearInternational = function () { };

function Company() {
    this.legalEntityID = ko.observable(0);
    this.legalEntityName = ko.observable('');
    this.isFemaleOwned = ko.observable(false);
    this.isMinorityOwned = ko.observable(false);
    this.webAddress = ko.observable();

    this.businessPhone = ko.observable();
    this.faxNumber = ko.observable();

    this.locked = ko.observable(false);

    ko.computed(function () {
        var newCountry = this.country();
        if (newCountry) {
            this.countryLookupID = newCountry.id.toString();
            if (newCountry.international) {
                this.clearDomestic();
            }
            else {
                this.clearInternational();
            }
        }
        else {
            this.countryLookupID = "";
        }

    }, this);
    ko.computed(function () {
        var newState = this.state();
        if (newState) {
            this.stateLookupID = newState.id.toString();
        }
        else {
            this.stateLookupID = "";
        }
    }, this);
}
Company.prototype = new Address;
Company.prototype.clearDomestic = function () {
    // Since we are entering this method via Address, we need a reference back to a real company object with self.
    this.businessPhone('');
    this.state(null);
    this.zipCode('');
};
Company.prototype.clearInternational = function () {
    this.province('');
};
Run Code Online (Sandbox Code Playgroud)

我将要做的逻辑中newstate,并newcountry在继承的每个对象来自Address这使得这个很不理想,但直到我找到一个更好的建议,我坚持这一点.

Kni*_*nio 1

我不确定我是否准确理解了问题,但请this.base(this);尝试致电this.base.call(this);? (在代码的第一个版本中)。