2010-01-08 78 views
3

我正在处理一个简单的问题以表示具有层次结构的几种类型。有一个数据行包含一些数据,并且数据可能因行的类型而异。一个简单的行可能只有一个标题和日期,而一个扩展行可能包含标题,描述,日期和图像。我对Javascript并不陌生,但对于继续前进的理解并不了解。举一个简单的例子,这里是我会怎么用Java编写:Javascript中的继承

interface Row { 
    View getView(); 
} 

class BasicRow implements Row { 
    private String title; 
    private String description; 

    public BasicRow(String title, String description) { 
     this.title = title; 
     this.description = description; 
    } 

    public View getView() { 
     // return a View object with title and description 
    } 
} 

class ExtendedRow implements Row { 
    private String title; 
    private String description; 
    private Date date; 
    private Image image; 

    public ExtendedRow(String title, String description, Date date, Image image) { 
     this.title = title; 
     this.description = description; 
     this.date = date; 
     this.image = image; 
    } 

    public View getView() { 
     // return a View object with title 
     // description, date, and image 
    } 
} 

有迹象表明,可以在这里完成,如从BasicRow延伸ExtendedRow只有定义新字段以及压倒一切的getView方法很少OO改进。

Javascript没有接口或抽象类,恐怕我还没有下降到原型意义上的思考。那么我怎么能够像Javascript中的上述例子那样基本实现一些基本类或接口,以及从这个基类继承的两个类,每个类都有自己的特定行为。

任何指针,非常感谢。

回答

7

看看道格拉斯Crockford的文章:

道格拉斯克罗克福德是在雅虎的高级 的JavaScript架构师他 众所周知的,他的工作在引进 JavaScript对象符号(JSON) - Wikipedia

这些文章是必须读取次数,我敢肯定,他们会帮助你找出如何构建对象。 “

+1

这些都确实很棒。它确实需要思考的一个重大转变,我想我会一整天都在窃取小细节,但这些链接真的帮助消除了很多疑问 – Anurag 2010-01-08 14:21:41

+0

很高兴为您解决了这个问题。当我第一次阅读这三篇文章时,我也有过相同的经历:) – roosteronacid 2010-01-08 15:35:47

2

看一看John Resig's article on inheritance in Javascript。 Resig的工作和Mootools.classMootools库的一部分)都是Dean Edward的衍生工作Base.js

希望有帮助。

+0

感谢您的链接。我真的很喜欢MooTools的Class和API设计,现在阅读这篇相当长的文章http://jqueryvsmootools.com来决定是否通过jQuery使用MooTools作为我的项目。 – Anurag 2010-01-08 12:42:09

+0

我认为尝试将JavaScript强制为经典的面向对象模型是一个错误。我更喜欢Crockford对JS功能的拥抱。 – Skilldrick 2010-01-08 13:43:48

+0

确实,但我只是指出,经典的OO是可行的 – 2010-01-08 14:32:51

1

”Javascript没有接口或抽象类,恐怕我还没有想到在原型意义上。“

你不需要无类型语言的接口。接口只允许编译器确保对象具有某些功能,因此可以进行类型检查。使用Javascript,你只需调用你想要和希望的方法(好吧,请确保你的部分... js不会帮助你)你调用它的对象具有该功能。