【问题标题】:How to get rid of instanseof in javascript如何摆脱javascript中的instanceof
【发布时间】:2015-06-03 07:14:20
【问题描述】:

我有一个类,它有两个方法:get()set()

function A() {
    var value = '';
    this.get = function () {
        return value;
    };
    this.set = function (v) {
        value = v;
    };
}

我有一个函数f()

/**
 *
 * @param { String | Number } b
 */
function f(b){
    var value;
    if(b instanceof A){
        value = b.get();
    }else{
        value = b;
    }
}

我可以创建一个对象:

var test = new A();
test.set('Hello');
f(test); //Hello
f(10); //10

instanceof 运算符测试对象的原型链中是否具有构造函数的原型属性。 我听说使用此运算符是一种不好的做法。 问题是:从我的代码中删除 instanceof 运算符是不可能的吗? 也许我应该使用强制类型转换或使用另一个 getter、setter?

>

我找到了简单的解决方案,我可以将 b.get 强制转换为布尔类型并检查它。它有效,但可能有附带影响。

 value = (!!b.get) ? b.get(): b;

>

另一种方式:value = (b.constructor = A) ? b.get(): b;

【问题讨论】:

  • 我听说使用此运算符是一种不好的做法 - 我想不出为什么会这样。不过,在这种特定情况下,您可以测试 get() 方法的存在,而不是检查 A 的特定实现
  • 在这种情况下,您可以使用 typeof 运算符。

标签: javascript class oop instanceof


【解决方案1】:

问题不是instanceof 运算符本身,而是您使用它的目的。您的函数需要两种不同类型的值:需要以某种方式处理的 A 实例或可以按原样使用的任何其他值。

问题在于 a) 为什么你的函数允许以两种不同的类型开头,而你不能将其统一为一种类型,b) 如果它接受“任何东西”或“A”,为什么A 专门而不是更笼统的东西?

假设你不能合理地改变a)点,你至少可以让b)变得更好:

if (typeof b.get == 'function') {
    value = b.get();
}

通过测试您感兴趣的实际事物:get 方法,您刚刚使您的函数更加灵活并适应未来的变化。 binstanceof A 与手头的任务无关,并且可能会在未来限制您。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-11-19
    • 2020-03-16
    • 2023-03-09
    • 2014-01-28
    • 2013-10-31
    • 2020-10-19
    • 2019-12-01
    相关资源
    最近更新 更多