如何检查匿名对象是否有方法?

如何检查创建的匿名对象是否为:

var myObj = {
prop1: 'no',
prop2: function () { return false; }
}

确实有一个提案2定义?

prop2总是被定义为一个函数,但是对于某些对象,它不是必需的,也不会被定义。

我尝试了这里建议的方法: 如何确定本机 JavaScript 对象是否具有属性/方法?,但我不认为它适用于匿名对象。

169274 次浏览

如果定义了函数,typeof myObj.prop2 === 'function';将通知您。

if(typeof myObj.prop2 === 'function') {
alert("It's a function");
} else if (typeof myObj.prop2 === 'undefined') {
alert("It's undefined");
} else {
alert("It's neither undefined nor a function. It's a " + typeof myObj.prop2);
}

一种方法必须是 if (typeof myObj.prop1 != "undefined") {...}

“匿名对象”是什么意思myObj不是匿名的,因为您已经为变量分配了一个对象文字。你可以试试这个:

if (typeof myObj.prop2 === 'function')
{
// do whatever
}

你想要 hasOwnProperty():

var myObj1 = {
prop1: 'no',
prop2: function () { return false; }
}
var myObj2 = {
prop1: 'no'
}


console.log(myObj1.hasOwnProperty('prop2')); // returns true
console.log(myObj2.hasOwnProperty('prop2')); // returns false

参考文献: Mozilla微软Phrogz.net

3个选择

  1. 如果属性名不是动态/生成的,则为 typeof myObj.prop2 === 'function'
  2. 如果属性名是动态的,只检查它是直接属性(而不是原型链)
  3. 如果属性名是动态的,则为 'prop2' in myObj,并检查原型链

我知道这是一个老问题,但是我感到惊讶的是,所有的答案都确保该方法存在 还有它是一个函数,当 OP 只想检查是否存在时。要知道它是一个函数(正如许多人所说的) ,你可以使用:

typeof myObj.prop2 === 'function'

但是你也可以使用一个条件:

typeof myObj.prop2

甚至:

myObj.prop2

这是因为函数的计算结果为 true,而 undefined的计算结果为 false。因此,如果你知道如果成员存在,它可能只是一个函数,你可以使用:

if(myObj.prop2) {
<we have prop2>
}

或者换句话说:

myObj.prop2 ? <exists computation> : <no prop2 computation>

最好使用 HasOwnProperty.call (obj,method)

在 ECMAScript 5.1中,添加了 Object.create,它支持创建具有指定[[ Prototype ]]的对象。Create (null)是用于创建将用作 Map 的对象的常见模式。如果假定对象将具有 Object.model 的属性,那么这可能会导致错误。此规则防止直接从对象调用某些 Object.Prototype 方法。

此外,对象的属性可能会影响 Object.model 上的内置程序,从而可能导致意外行为或拒绝服务安全漏洞。例如,Web 服务器解析来自客户端的 JSON 输入并直接在结果对象上调用 hasOwnProperty 是不安全的,因为恶意客户端可能会发送类似于{“ hasOwnProperty”: 1}的 JSON 值并导致服务器崩溃。

为了避免像这样的细微错误,最好总是从 Object.model 调用这些方法。例如,foo.hasOwnProperty (“ bar”)应该替换为 Object.Prototype.hasOwnProperty.call (foo,“ bar”)。

const myObj = {
prop1: 'no',
prop2: function () { return false }
}


console.log(Object.prototype.hasOwnProperty.call(myObj, 'prop2'))
console.log(Object.prototype.hasOwnProperty.call(myObj, 'prop3'))