首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >JavaScript是否有接口类型(比如Java的“接口”)?

JavaScript是否有接口类型(比如Java的“接口”)?
EN

Stack Overflow用户
提问于 2010-09-14 23:16:46
回答 9查看 314.9K关注 0票数 386

我正在学习how to make OOP with JavaScript。它有接口的概念(比如Java的interface)吗?

所以我可以创建一个监听器...

EN

回答 9

Stack Overflow用户

发布于 2010-09-14 23:53:53

拿一本Dustin Diaz的“JavaScript design patterns”吧。有几章专门介绍了通过Duck类型实现JavaScript接口。这也是一本不错的读物。但是,没有接口的语言原生实现,您必须使用Duck Type

代码语言:javascript
复制
// example duck typing method
var hasMethods = function(obj /*, method list as strings */){
    var i = 1, methodName;
    while((methodName = arguments[i++])){
        if(typeof obj[methodName] != 'function') {
            return false;
        }
    }
    return true;
}

// in your code
if(hasMethods(obj, 'quak', 'flapWings','waggle')) {
    //  IT'S A DUCK, do your duck thang
}
票数 84
EN

Stack Overflow用户

发布于 2017-07-26 23:21:17

希望任何还在寻找答案的人都会发现它是有帮助的。

您可以尝试使用代理(这是自ECMAScript 2015以来的标准):https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy

代码语言:javascript
复制
latLngLiteral = new Proxy({},{
    set: function(obj, prop, val) {
        //only these two properties can be set
        if(['lng','lat'].indexOf(prop) == -1) {
            throw new ReferenceError('Key must be "lat" or "lng"!');
        }

        //the dec format only accepts numbers
        if(typeof val !== 'number') {
            throw new TypeError('Value must be numeric');
        }

        //latitude is in range between 0 and 90
        if(prop == 'lat'  && !(0 < val && val < 90)) {
            throw new RangeError('Position is out of range!');
        }
        //longitude is in range between 0 and 180
        else if(prop == 'lng' && !(0 < val && val < 180)) {
            throw new RangeError('Position is out of range!');
        }

        obj[prop] = val;

        return true;
    }
});

然后你可以很容易地说:

代码语言:javascript
复制
myMap = {}
myMap.position = latLngLiteral;

如果你想通过instanceof (@Kamaffeather询问)进行检查,你可以将它封装在一个对象中,如下所示:

代码语言:javascript
复制
class LatLngLiteral {
    constructor(props)
    {
        this.proxy = new Proxy(this, {
            set: function(obj, prop, val) {
                //only these two properties can be set
                if(['lng','lat'].indexOf(prop) == -1) {
                    throw new ReferenceError('Key must be "lat" or "lng"!');
                }

                //the dec format only accepts numbers
                if(typeof val !== 'number') {
                    throw new TypeError('Value must be numeric');
                }

                //latitude is in range between 0 and 90
                if(prop == 'lat'  && !(0 < val && val < 90)) {
                    throw new RangeError('Position is out of range!');
                }
                //longitude is in range between 0 and 180
                else if(prop == 'lng' && !(0 < val && val < 180)) {
                    throw new RangeError('Position is out of range!');
                }

                obj[prop] = val;

                return true;
            }
        })
        return this.proxy
    }
}

这可以不使用Proxy,而使用类getterssetters来完成

代码语言:javascript
复制
class LatLngLiteral {
    #latitude;
    #longitude;

    get lat()
    {
        return this.#latitude;
    }

    get lng()
    {
        return this.#longitude;
    }
    
    set lat(val)
    {
        //the dec format only accepts numbers
        if(typeof val !== 'number') {
            throw new TypeError('Value must be numeric');
        }

        //latitude is in range between 0 and 90
        if(!(0 < val && val < 90)) {
            throw new RangeError('Position is out of range!');
        }
        
        this.#latitude = val
    }
    
    set lng(val)
    {
        //the dec format only accepts numbers
        if(typeof val !== 'number') {
            throw new TypeError('Value must be numeric');
        }

        //longitude is in range between 0 and 180
        if(!(0 < val && val < 180)) {
            throw new RangeError('Position is out of range!');
        }
        
        this.#longitude = val
    }
}
票数 9
EN

Stack Overflow用户

发布于 2010-09-14 23:25:26

您需要Java中的接口,因为它是静态类型的,并且类之间的协定应该在编译期间是已知的。在JavaScript中则不同。JavaScript是动态类型的;这意味着当您获取对象时,您可以只检查它是否有特定的方法并调用它。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3710275

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档