- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
网上有很多关于组合与继承的信息,但我还没有找到像 JavaScript 的例子。使用下面的代码来演示继承:
function Stock( /* object with stock names and prices */ ) {
for (var company_name in arguments[0]) {
// copy the passed object into the new object created by the constructor
this[company_name] = arguments[0][company_name];
}
}
// example methods in prototype, their implementation is probably redundant for
// this question, but list() returns an array with toString() invoked; total()
// adds up the stock prices and returns them. Using ES5 feature to make
// inherited properties non-enumerable
Stock.prototype = {
list: function () {
var company_list = [];
for (var company_name in this)
company_list.push(company_name);
return company_list.toString();
},
total: function () {
var price_total = 0;
for (var company_name in this)
price_total += this[company_name];
return '$' + price_total;
}
};
Object.defineProperties(Stock.prototype, {
list: { enumerable: false },
total: { enumerable:false }
});
var portfolio = new Stock({ MSFT: 25.96, YHOO: 16.13, AMZN: 173.10 });
portfolio.list(); // MSFT,YHOO,AMZN
portfolio.total(); // $215.19
Stock.total = function(){ /* code */ }
我只是把它们放在那里是为了花哨)。如果 OOP 中的很多情况都喜欢组合,为什么大多数使用 JavaScript 的人似乎只使用原型(prototype)和继承?我在网上没有找到很多关于 JavaScript 组合的信息,只有在其他语言中。
最佳答案
在处理组合与继承时,语言无关紧要。如果您了解什么是类以及类的实例是什么,那么您就拥有了所需的一切。
组合只是当一个类由其他类组成时;或者换一种说法,一个对象的实例引用了其他对象的实例。
继承是指一个类从另一个类继承方法和属性。
假设您有两个功能 A 和 B。您想定义第三个功能 C,它具有 A 和 B 的部分或全部。您可以使 C 从 B 和 A 扩展,在这种情况下,C 拥有 B 的所有内容A 有因为 C isA
B 和 A,或者您可以使 C 的每个实例具有 A 的实例和 B 的实例,并调用这些功能上的项。在后一种情况下,每个实例 C 实际上都包含一个 B 的实例和一个 A 的实例。
当然,根据语言,您可能无法从 2 个类扩展一个类(例如 Java 不支持多重继承),但这是与该概念无关的语言特定细节。
现在,对于语言特定的细节......
我使用了类这个词,但 javascript 没有类的概念。它有对象,仅此而已(简单类型除外)。 Javascript 使用原型(prototype)继承,这意味着它有一种有效定义对象和这些对象上的方法的方法(这是另一个问题的主题;您可以搜索 SO,因为已经有答案。)
所以继续我们上面的例子,你有 A、B 和 C。
对于继承,你会有
// define an object (which can be viewed as a "class")
function A(){}
// define some functionality
A.prototype.someMethod = function(){}
C.prototype = new A();
C.prototype.constructor = A;
someMethod
,因为 C 的每个实例“都是 A”A。
function C(){
this.a = new A();
this.b = new B();
}
// someMethod on C invokes the someMethod on B.
C.someMethod = function(){
this.a.someMethod()
}
C.prototype = new B();
C.prototype.constructor = B;
C.prototype.constructor = A;
instanceof
有影响运算符(operator)。
A = {
method1: function(){}
}
B = {
method2: function(){}
}
C = SC.Object.extend(A, B, {
method3: function(){}
}
A
和
B
,然后将两者的功能添加到
C
,所以 C 的每个实例都有方法 1、2 和 3。在这种特殊情况下,
extend
方法(由框架提供)完成设置对象原型(prototype)的所有繁重工作。
C.someMethod = function(){
this.a.someMethod(arg1, arg2...);
}
this
或传入,无论如何......)
call
(或
apply
)javascript 方法,基本上允许您设置函数的范围。
C.someMethod = function(){
this.a.someMethod.call(this, arg1, arg2...);
}
C.someMethod = function(){
var someMethodOnA = this.a.someMethod;
someMethodOnA.call(this, arg1, arg2...);
}
call
这里的调用是设置
someMethodOnA
的范围至
this
,这是 C 的实例。
关于javascript - JavaScript 中的组合、继承和聚合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8696695/
我有一个 Cassandra 集群,里面有 4 个表和数据。 我想使用聚合函数(sum,max ...)发出请求,但我在这里读到这是不可能的: http://www.datastax.com/docu
我有以下两张表 Table: items ID | TITLE 249 | One 250 | Two 251 | Three 我投票给这些: Table: votes VID | IID | u
这个问题在这里已经有了答案: Update MongoDB field using value of another field (12 个答案) 关闭 3 年前。 我想根据另一个“源”集合的文档中
我的收藏包含以下文件。我想使用聚合来计算里面有多少客户,但我遇到了一些问题。我可以获得总行数,但不能获得总(唯一)客户。 [{ _id: "n001", channel: "Kalip
我有下表 Id Letter 1001 A 1001 H 1001 H 1001 H 1001 B 1001 H 1001 H 1001
得到一列的表 ABC。 “创建”的日期列。所以样本值就像; created 2009-06-18 13:56:00 2009-06-18 12:56:00 2009-06-17 14:02:0
我有一个带有数组字段的集合: {[ name:String buyPrice:Int sellPrice:Int ]} 我试图找到最低和最高买入/卖出价格。在某些条目中,买入或卖出价格为零
我有以下问题: 在我的 mongo db 中,我有以下结构: { "instanceId": "12", "eventId": "0-1b", "activityType":
下面给出的是我要在其上触发聚合查询的 Elasticsearch 文档。 { "id": 1, "attributes": [ { "fieldId": 1,
我正在使用 Django 的 aggregate query expression总计一些值。最终值是一个除法表达式,有时可能以零作为分母。如果是这种情况,我需要一种方法来逃避,以便它只返回 0。 我
我正在学习核心数据,特别是聚合。 当前我想要做的事情:计算表中在某些条件上具有逆关系的多对关系的记录数。 目前我正在这样做: NSExpression *ex = [NSExpression expr
我需要有关 Delphi 中的 ClientDatasets 的一些帮助。 我想要实现的是一个显示客户的网格,其中一列显示每个客户的订单数量。我将 ClientDataset 放在表单上并从 Delp
我的集合有 10M 个文档,并且有一个名为 movieId 的字段;该文档具有以下结构: { "_id" : ObjectId("589bed43e3d78e89bfd9b779"), "us
这个问题已经有答案了: What is the difference between association, aggregation and composition? (21 个回答) 已关闭 9
我在 elasticsearch 中有一些类似于这些示例的文档: { "id": ">", "list": [ "a", "b", "c" ] } { "id"
我正在做一些聚合。但是结果完全不是我所期望的,似乎它们没有聚合索引中与我的查询匹配的所有文档,在这种情况下 - 它有什么好处? 例如,首先我做这个查询: {"index":"datalayer","t
假设我在 ES 中有这些数据。 | KEY | value | |:-----------|------------:| | A |
可能在我的文档中,我有一个被分析的文本字段。我只是在ElasticSearch AggregationAPI中迷路了。我需要2种不同情况的支持: 情况A)结果是带有计数标记(条款)的篮子下降。 情况B
我正在为网上商店构建多面过滤功能,如下所示: Filter on Brand: [ ] LG (10) [ ] Apple (5) [ ] HTC (3) Filter on OS: [ ] Andr
我有一个父/子关系并且正在搜索 child 。 是否可以在父属性上创建聚合? 例如parent 是 POST,children 是 COMMENT。如果父项具有“类别”属性,是否可以搜索 COMMEN
我是一名优秀的程序员,十分优秀!