【问题标题】:There is a way to create a generic function for literal Object?有一种方法可以为文字对象创建通用函数吗?
【发布时间】:2019-03-28 15:28:44
【问题描述】:

我想创建一个可以被我的每个文字对象使用的函数,并使用this 参数引用caller

类似的东西:

const literalObject = { 
    "value" : "string"
}

const genricFunction = () =>{
    console.log("value : ",this.value)
}

literalObject.genricFunction()

【问题讨论】:

标签: javascript


【解决方案1】:

你可以这样做

function obj() {
    this.value = 'string'
}

obj.prototype.getValue = function() {
   return this.value
}

let myObj = new obj()
myObj.getValue(); // 'string' 

【讨论】:

  • 这是最好的方法,但您可以通过添加一些解释并使用与 OP 相同的名称来改进此答案(myObj -> literalObjectgetValue -> genricFunction) 以便他们可以更轻松地将其映射到他们的问题。
【解决方案2】:

您可以将通用函数分配给Object.prototype。这是您的更新代码。

const literalObject = { 
    "value" : "string"
}

const genericFunction = function() {
    console.log("value : ",this.value)
}

Object.prototype.genericFunction = genericFunction

literalObject.genricFunction()

虽然这会起作用,但这被认为是不好的做法。你想要这个的用例是什么,也许我们可以为你推荐一个更好的方法。

【讨论】:

  • 当我使用() => 而不是function ().this 指向Window 元素时,它可以工作但很奇怪。
  • @MrRock 这并不奇怪,这是箭头函数和常规函数之间的主要区别(箭头函数在被调用时不会得到 this,所以 this 只是引用相同的 this作为下一个词法范围)。
【解决方案3】:

你可以这样做:

const obj ={genricFunction:function(){console.log("value : ",this.value)}}

然后像这样创建每个对象:

const newObj = Object.create(obj)
newObj.value=“string”

【讨论】:

    【解决方案4】:

    您可以创建literalObjectgenericFunction

    const literalObject = { 
        "value" : "string"
    }
    
    const genricFunction = function () {
        console.log("value : ",this.value)
    }
    

    然后将属性分配给literalObject,绑定genericFunction

    literalObject.genericFunction = genricFunction.bind(literalObject);
    

    无论何时打电话

    literalObject.genricFunction();
    

    它将使用literalObject 作为this

        const literalObject = { 
            "value" : "string"
        }
        
        const genricFunction = function () {
            document.write(JSON.stringify(this.value));
        }
        
        literalObject.genricFunction = genricFunction.bind(literalObject);
        
        literalObject.genricFunction();

    【讨论】:

    • 这个解决方案最符合我尝试做的事情,ty
    猜你喜欢
    • 1970-01-01
    • 2011-10-25
    • 2019-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-06
    • 2011-07-24
    • 1970-01-01
    相关资源
    最近更新 更多