繁体   English   中英

您如何在JavaScript中实现类似静态方法的功能?

[英]How do you implement something like a static method in JavaScript?

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

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相同的样式进行访问?

在JavaScript中,函数是一流的对象。 这样就可以直接为其分配方法属性,该属性的行为类似于静态方法:

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

就像您期望的那样。

DZone的 ref卡为面向对象的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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM