两种方法有什么区别?

时间:2012-08-20 00:52:53

标签: javascript oop

我可以直接调用Date对象的parse方法,如下所示:

    alert(Date.parse("March 21, 2012"));

但我不能这样做:

    alert(Date.getTime()); // TypeError: Date.getTime is not a function

这就是我如何运作:

    alert(new Date().getTime()); // works well

那么为什么我不能像Date.parse()那样直接调用Date.getTime()?

基础问题:我编写了一个类,我想直接使用它的一些方法,如上面的Date.parse()。

4 个答案:

答案 0 :(得分:6)

getTime位于Date.prototype,用于构建new Date()个对象。

parse本身位于Date中,因此直接调用而不是从构造对象调用。

这是a post about JavaScript prototypes的阅读乐趣。

答案 1 :(得分:3)

在面向对象的编程中,前者称为静态方法,而后者称为实例方法。实例方法需要实例化对象的实例(因此需要new Date()调用)。静态方法没有这个要求。

  

基础问题:我编写了一个类,我想直接使用它的一些方法,如上面的Date.parse()。

编写完课程后,要添加静态方法,您需要执行以下操作:

MyClass.myStaticFunction = function() {
    // Contents go here.
}

答案 2 :(得分:1)

正如其他人所指出的,JavaScript使用原型来定义实例方法。但是,您可以定义静态方法,如下所示。我不是试图在这里定义整个Date对象,而是展示如何定义它的实例和静态函数。

// constructor defined here
function Date() {
    // constructor logic here
}

// this is an instance method
DateHack.prototype.getTime = function() {
    return this.time_stamp;
}

// this method is static    
Date.parse = function(value) {
    // do some parsing
    return new Date(args_go_here);
}

答案 3 :(得分:1)

function Class() {
    this.foo = function() { return 123; };
}
Class.bar = function() { return 321; };

Class.bar(); // 321

( new Class ).foo(); // 123