gpt4 book ai didi

javascript - JavaScript 中的继承,我做对了吗?

转载 作者:塔克拉玛干 更新时间:2023-11-02 22:25:19 24 4
gpt4 key购买 nike

我有一个 BaseService 可以轻松与我的服务器端 API 交互,我想为特定的 API 资源“子类化”它。有什么比直接从完成所有艰苦工作的 BaseService 继承更好的方法?

所以,我已经设置好了它,并且它可以工作,但是我不完全确定我这样做的方式是否正确,因为我已经读到 JS 中有多种类型的继承。这是我发现的一些代码的链接,它们以不同的方式执行此操作:https://github.com/roblevintennis/Testing-and-Debugging-JavaScript/blob/master/code/objects/lib/js_inheritance.js

这就是我的做法。为了简洁起见,我省略了函数体。

BaseService,我的实现将从中继承。

BaseService.prototype.get = function (resource, data, parameterOverrides) {
return aPromisedLandOfDragons();
};

BaseService.prototype.post = function (resource, data, parameterOverrides) {
return aPromisedLandOfDragons();
};

BaseService.prototype.put = function (resource, data, parameterOverrides) {
return aPromisedLandOfDragons();
};

BaseService.prototype.destroy = function (resource, data, parameterOverrides) {
return aPromisedLandOfDragons();
};

function BaseService(resource) {
this.apiEndpoint = "/api/" + resource + "/";
}

这里是一个可以直接使用BaseService的实现,将API资源传递给构造函数。

AccountService.prototype = new BaseService("Accounts");
AccountService.prototype.getAll = function(searchString) {
// Uses the BaseService method. Lovely!
return this.get(null, {
searchString: searchString || ""
});
};

function AccountService() {

}

所以,我的问题是(并希望它不会因为过于本地化而被关闭):这是在 JavaScript 中进行继承的好方法吗?它是否有任何可以显着改善的性能影响?

顺便说一句:如果我想直接覆盖基类的方法,例如 .get,是否可以这样做,同时仍然能够调用基类的实现?

P.S:我知道从技术上讲,JavaScript 中没有类之类的东西,但请耐心等待。

最佳答案

虽然完全有可能按照您编写和打算的方式进行,但有很多理由避免经典继承(参见 Classical Vs prototypal inheritance ),而有很多理由支持组合。让我们看一下原型(prototype)继承可能是什么:

var base = {
get: function (resource, data, parameterOverrides) {
return aPromisedLandOfDragons();
},

post: function (resource, data, parameterOverrides) {
return aPromisedLandOfDragons();
},

put: function (resource, data, parameterOverrides) {
return aPromisedLandOfDragons();
},

destroy: function (resource, data, parameterOverrides) {
return aPromisedLandOfDragons();
}
};

// Use a factory to instantiate instances:
function baseService(resource) {
var instance = Object.create(base);
instance.apiEndpoint = "/api/" + resource + "/";
return instance;
}

var withAccount = {
getAll: function(searchString) {
// Uses the BaseService method. Lovely!
return this.get(null, {
searchString: searchString || ""
});
}
};

function accountService(resource) {
var instance = mixIn({}, base, withAccount);
instance.apiEndpoint = "/api/" + resource + "/";
return instance;
}

以这种方式进行操作可以在未来获得更大的灵 active 。如果您使用 Stampit 库,它会变得更加容易:

var base = stampit().methods({
get: function (resource, data, parameterOverrides) {
return aPromisedLandOfDragons();
},

post: function (resource, data, parameterOverrides) {
return aPromisedLandOfDragons();
},

put: function (resource, data, parameterOverrides) {
return aPromisedLandOfDragons();
},

destroy: function (resource, data, parameterOverrides) {
return aPromisedLandOfDragons();
}
}).enclose(function () {
this.apiEndpoint = '/api/' + this.resource + '/';
delete this.resource;
});

var withAccount = stampit().methods({
getAll: function(searchString) {
// Uses the BaseService method. Lovely!
return this.get(null, {
searchString: searchString || ""
});
}
});

var accountService = stampit.compose(base, withAccount);

// Watch it work:

var myAccountService = accountService({resource: 'foo'});
// { apiEndpoint: '/api/foo/' }

关于javascript - JavaScript 中的继承,我做对了吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18642989/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com