Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/380.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaScript SDK设计中访问器属性的使用?_Javascript_Getter Setter_Api Design - Fatal编程技术网

JavaScript SDK设计中访问器属性的使用?

JavaScript SDK设计中访问器属性的使用?,javascript,getter-setter,api-design,Javascript,Getter Setter,Api Design,我正在设计一个javascriptsdk,通过抽象掉一些复杂性,使使用特定的、复杂的restapi变得更简单 SDK将提供的某些对象需要公开可以设置和检索的属性 我曾使用并研究过其他JavaScript SDK,显式getter/setter函数似乎普遍用于访问器属性 举例说明我的意思: 显式getter/setter函数 存取器属性 对我来说,这里最重要的区别不是实际的实现,而是最终用户如何操纵对象;第一种情况下通过函数调用,第二种情况下通过直接赋值 这两种实现都允许在设置值时进行错误检查/清

我正在设计一个javascriptsdk,通过抽象掉一些复杂性,使使用特定的、复杂的restapi变得更简单

SDK将提供的某些对象需要公开可以设置和检索的属性

我曾使用并研究过其他JavaScript SDK,显式getter/setter函数似乎普遍用于访问器属性

举例说明我的意思:

显式getter/setter函数

存取器属性

对我来说,这里最重要的区别不是实际的实现,而是最终用户如何操纵对象;第一种情况下通过函数调用,第二种情况下通过直接赋值

这两种实现都允许在设置值时进行错误检查/清理,以及在检索内部值时动态地对其进行变异

那么,为什么大多数SDK似乎都避免使用访问器属性呢?使用它们是个坏主意吗?如果不是,什么时候使用它们而不是显式的getter/setter函数合适?以下是我想到的一些原因:

在旧的web浏览器中缺少支持 在开发环境/web浏览器中检查对象时,开发人员可能会感到困惑 如果开发人员不期望直接分配会产生副作用,那么他们可能会感到困惑
如果语言为此目的提供了一种显式的访问器机制,那么为什么用显式的getter/setter函数重新设计轮子会更流行呢?

一个原因是有些人仍然使用IE8及更低版本,而IE8及更低版本缺乏对Object.defineProperty的可用支持。对于试图设计可在此类环境中使用的通用可访问SDK的人来说,这是一个非常重要的问题。能手和二传手没有这个问题。

我认为这是基于观点的。但我更喜欢第一种情况,因为它很简单。Acessor会让你的代码变得更大、更混乱,就像你说的那样,你会做与第一个案例完全相同的事情。还有一种更简单的可能性,就是在不需要的时候不使用访问器。不要让您的JS代码看起来像Java。@值得一提的是,还有一个Java SDK也将提供类似的用途,因此在这种情况下,两个API外观相似可能会带来一些好处。我意识到这个想法需要与适合两种语言的内容相平衡。大多数SDK可能希望在IE8上运行。这是我能看到的唯一好理由
function Widget() {
    return {
        setName: function(name) {
            //Sanitization, error checking, etc, could go here.
            this.name = name;
        },
        getName: function() {
            return this.name;
        }
    }
}

var widget = new Widget();
widget.setName("Testing");
w.getName(); //"Testing"
function Widget(name) {
    //Internal property that is modified by the accessor property.
    this._name = name;
}
Object.defineProperty(Widget.prototype, "name", {
    get: function() {
        return this._name;
    },
    set: function(value) {
        //Sanitization, error checking, etc, could go here.
        this._name = value;
    }
});

var widget = new Widget();
widget.name = "Testing";
widget.name; //"Testing"