你如何在JavaScript中实现类似静态方法的东西?

时间:2014-12-08 15:23:10

标签: javascript

我正在浏览String的文档,引用String.fromCharCode。我注意到它与大多数其他String方法的不同之处在于它在方法之前没有.prototype,例如。 String.prototype.CharCodeAt。我假设它必须类似于java中的静态引用,因为它的用法要求你引用String class / Object,例如。

var str = "foo";
var code = str.charCodeAt(0);
var character = String.fromCharCode(code); // This is the reference I'm talking about
alert(code); // Output: 102
alert(character); // Output: f

我的问题是你如何实现一个方法,以便在你自己的代码中以与String.fromCharCode相同的方式访问它?

2 个答案:

答案 0 :(得分:2)

在JavaScript中,函数是第一类对象。它可以直接为它分配方法属性,它将表现为静态方法:

function MyObject() {}
MyObject.static = function() { ... }

就像你期望的那样。

答案 1 :(得分:0)

DZone's参考卡为面向对象的javascript提供了很好的参考,我强烈推荐它。相关段落

  

静态成员没有直接支持。构造函数   用于创建静态成员。无法访问静态成员   使用“this”关键字。

私人静态会员

   function Factory(){}
    // public static method
    Factory.getType = function (){
      return “Object Factory”;
    };

    // public static field
    Factory.versionId = “F2.0”;
    Factory.prototype.test = function(){
      console.log(this.versionId); // undefined
      console.log(Factory.versionId); // F2.0
      console.log(Factory.getType()); // Object Factory
    }
    var factory = new Factory();
    factory.test();

公共静态成员

var Book = (function () {
// private static field
    var numOfBooks = 0;
// private static method
    function checkIsbn(isbn) {
        if (isbn.length != 10 && isbn.length != 13)
            throw new Error(“isbn is not valid!”);
    }

    function Book(isbn, title) {
        checkIsbn(isbn);
        this.isbn = isbn;
        this.title = title;
        numOfBooks++;
        this.getNumOfBooks = function () {
            return numOfBooks;
        }
    }

    return Book;
})();
var firstBook = new Book(“0-943396-04-2”, “First Title”);
console.log(firstBook.title); // First Title
console.log(firstBook.getNumOfBooks()); // 1
var secondBook = new Book(“0-85131-041-9”, “Second Title”);
console.log(firstBook.title); // First Title
console.log(secondBook.title); // Second Title
console.log(firstBook.getNumOfBooks()); // 2
console.log(secondBook.getNumOfBooks()); // 2
相关问题