Do not access Object.prototype method ‘hasOwnProperty‘ from target object Do not access Object.p

今天在学习Vue时,写了一个TodoList小案例,实现其编辑功能,使用hasOwnProperty,对todo上是否有该属性,进行if判断时,发现报错,我的代码如下:

    //编辑
    handleEdit(todo) {
      if (todo.hasOwnProperty('isEdit')) {
        todo.isEdit = true
      } else {
        this.$set(todo, 'isEdit', true)
      }

    },

解决方案

    //编辑
    handleEdit(todo) {
      if (Object.prototype.hasOwnProperty.call(todo, "isEdit")) {
        todo.isEdit = true
      } else {
        this.$set(todo, 'isEdit', true)
      }

    },

发现是新版本的ESLint使用了禁止直接调用 Object.prototypes 的内置属性开关,说白了就是ESLint 配置文件中的 "extends": "eslint:recommended" 属性启用了此规则。

在ECMAScript 5.1中,新增了 Object.create,它支持使用指定的 [[Prototype]] 创建对象。Object.create(null) 是一种常见的模式,用于创建将用作映射的对象。当假定对象将包含来自Object.prototype 的属性时,这可能会导致错误。该规则防止直接从一个对象调用某些 Object.prototype 的方法。

此外,对象可以具有属性,这些属性可以将 Object.prototype 的内建函数隐藏,可能导致意外行为或拒绝服务安全漏洞。例如,web 服务器解析来自客户机的 JSON 输入并直接在结果对象上调用 hasOwnProperty 是不安全的,因为恶意客户机可能发送一个JSON值,如 {"hasOwnProperty": 1},并导致服务器崩溃。

为了避免这种细微的 bug,最好总是从 Object.prototype 调用这些方法。例如,foo.hasOwnProperty("bar") 应该替换为 Object.prototype.hasOwnProperty.call(foo, "bar")

所以,你可以关闭提示,也可以更新代码,个人建议更新代码,毕竟代码不规范引起的。

参考地址: https://cn.eslint.org/docs/rules/


关于call方法

call() 方法是预定义的 JavaScript 方法。
它可以用来调用所有者对象作为参数的方法。
通过 call(),您能够使用属于另一个对象的方法。

案例

这里相当于改变了当前this指向,我 person1 虽然并没有show方法(就和你无法直接访问原型上的 hasOwnProperty方法一样),但是我可以通过 call 使用person中的 show 方法 来使用,作用于该 show 方法上的相关属性还是我本身 person1 的

var person = {
  name: 'xiaoliao',
  sex: 'man'
  show: function(){
    return this.name + '' + this.sex
  }
}
 
var person1 = {
  name: 'xiaowang',
  sex: 'woman'
}
 
//调用person的show方法,并用于 person1
person.show.call(person1)    //xiaowang woman
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值