【发布时间】:2013-06-18 21:56:15
【问题描述】:
在我的 JavaScript 应用程序中,我有几种对象,包括 Query、Document 和 Posting。文档包含一堆关于文档的元数据(标题、摘要等);一个 Posting 表示某个 Query 在某个级别检索到的某个 Document。同一个 Document 可能被多个 Query 检索,因此可能有多个 Posting 与之关联。
该应用程序有两个相关视图:一个显示给定查询的所有过帐,另一个显示所有文档。由于用户可以以几乎相同的方式与这两个视图交互,我决定通过将 Document 实例作为一个或多个 Posting 实例的原型来使用原型继承。这样,Posting 继承了 Document 的所有元数据,并且只添加了自己的 Query 引用和排名值。像魅力一样工作。
除了数据(查询、排名)之外,帖子还带有一些行为。我想排除这种行为,这样我就不会创建数千个相同的方法。在 Document 的情况下,我只是将我所有的函数移到了Document.prototype。但是在 Postings 的情况下,我不能这样做,因为每个 Postings 都有不同的原型(其各自的文档)。虽然我可以将 Posting 使用的一些方法放入 Document.prototype 并以这种方式获取它们,但其中一些方法是多态的,需要针对 Document 和 Posting 以不同的方式实现。
我的问题是这样的:如果我在 Posting 中使用原型继承来携带 数据,我是否还能以某种方式排除 行为,以便我重用相同的方法函数实例对于我所有的 Posting 实例,而不是每次创建新的 Posting 时都创建一批新的方法?
function Document(id, title) {
this.id = id;
this.title = title;
}
// Here prototype is used to factor out behavior
Document.prototype.document = function() { return this; }
Document.prototype.toString = function() { return 'Document [' + this.id + ']: "' + this.title + '"'; }
function Posting(query, rank) {
this.query = query;
this.rank = rank;
// Can I move these two definitions out of the Posting instance to avoid
// creating multiple copies of these functions as I construct 1000s of Postings?
this.document = function() { return Object.getPrototypeOf(this); }
this.toString = function() { return this.document().toString() + ' at rank ' + this.rank; }
}
function createPosting(query, document, rank) {
// here prototype is used to share data
Posting.prototype = document;
var posting = new Posting(query, rank);
return posting;
}
更新
我在上面的代码示例中犯了一个错误:进行继承的正确方法(如下面的 cmets 所指出的)是首先设置原型:Posting.prototype = document; 我认为我的其余问题仍然有效 :-)
【问题讨论】:
-
posting.prototype = Document;这有什么意义?posting是一个对象,prototype属性没有任何特定含义。您不是以这种方式设置继承。只有 functions 的prototype属性是特殊的。一般来说,我不得不说,让 Posting 实例从特定的 Document 实例继承听起来不像是对继承的正确使用。也许你更在寻找作文? IE。 Posting 有一个 Document,而不是 Posting is a Document。 -
如果这是在浏览器中,我会选择不同的名称,因为
Document已经有意义。 -
@CrazyTrain 你的意思是
document(小写D)还是一般的意思?像那样“文档”的概念在浏览器中有意义吗?我不确定是否有一些我不知道的神奇Document对象:) -
@Ian:
Document是浏览器中的构造函数。document instanceof Document; // true -
@Gene:是的,我明白了,但正如我所说,只有 函数 具有特殊的
prototype属性。如果将prototype属性分配给一个对象,它只是一个名为“原型”的任意属性。没有建立继承。
标签: javascript inheritance prototype