JavaScript拥有OwnProperty与类型
JavaScript hasOwnProperty vs typeof
我在谷歌上搜索了很多,但找不到我要找的地方:
使用Object.hasOwnProperty与在属性未定义时进行测试的好处
jsperf速度测试
如何确定本机JavaScript对象是否具有属性/方法?
和许多其他网站,但这不是我要找的地方。我真正的问题是:
为什么hasOwnProperty
在他的超类(原型)中找不到方法?为什么有人会使用hasOwnProperty
?它比typeof
慢得多,如果您使用继承,它就不起作用
第二个问题:
在这个问题中,Barney回答说您必须使用if ('property' in objectVar)
来检查属性是否存在,但没有解释原因。有人知道你为什么要使用这种结构吗?
var objA = function(){};
objA.prototype.alertMessage = function(){
return 'Hello A';
};
var objB = function(){
this.hello = function(){
return 'hello';
};
};
// Inheritance
objB.prototype = Object.create(objA.prototype);
objB.prototype.constructor = objA;
var test = new objB();
if (test.hasOwnProperty("alertMessage")){
console.log("hasOwnProperty: " + test.alertMessage());
}
if (typeof test.alertMessage === "function"){
console.log("typeof: " + test.alertMessage());
}
if (test.hasOwnProperty("hello")){
console.log("hasOwnProperty: " + test.hello());
}
if (typeof test.hello === "function"){
console.log("typeof: " + test.hello());
}
查看jsFiddle
使用(在某些情况下有要使用)hasOwnProperty
的原因有很多,以及为什么它的行为是这样的:
- 顾名思义,
hasOwnProperty
检查测试的对象是否拥有具有给定名称的属性。如果它从另一个对象(其原型)继承了一个方法/属性,那么该属性的所有者不是该对象,而是其原型。因此,对象没有自己的名为X的属性 typeof
在大多数情况下都可以工作,但对象可以是这样的:var o = {foo: undefined}
。当然,在o.foo
上使用typeof
会产生"undefined"
,但对象确实拥有一个名为foo
的属性- 使用
if ('properyname' in object)
是一种变通方法,它结合了两个世界的优点:在o = {foo: undefined};
的情况下,它将求值为true,而不需要查找hasOwnPropery
方法(这是Object.prototype
的一个属性)或具有上下文绑定的函数调用等开销。它还将在原型链中找到属性
因此,请考虑以下示例:
var o = {foo: undefined,
toString: undefined};//overwrite inherited method
console.log(typeof o.foo);//undefined
console.log(typeof o.toString);//undefined
console.log(o.hasOwnProperty('toString'));//true
delete(o.toString);
console.log(typeof o.toString);//function
if ('valueOf' in o)
console.log(o.valueOf === Object.prototype.valueOf);//true
if ('foo' in o)
console.log(o.foo);//undefined
另一件需要注意的重要事情是,您关于hasOwnProperty
在处理继承时不起作用的声明是完全错误的。在JS中使用的每个对象都至少继承一个原型。认识、理解和尊重这一点很重要。如果在对象上循环,建议确保实际在属于对象本身的属性上迭代。因此,这并不罕见:
for (p in obj)
{
if (obj.hasOwnProperty(p))
//process property
}
这是为了避免代码遍历原型链中的所有属性,这可能会破坏超级对象
if (!Object.prototype.hasProperty)
{//dirty check ;-P
Object.prototype.hasProperty = (function(OP)
{
return function(name)
{
//typeof for speed: if value is not undefined, return true
if (typeof this[name] !== 'undefined' || this.hasOwnProperty(name))
return true;
if (this === OP)//we've just checked the Object.prototype, found nothing, so return false
return false;
return Object.getPrototypeOf(this).hasProperty(name);//check prototype
};
}(Object.prototype));//OP is object prototype
}
相关文章:
- 为什么会出现错误;未捕获的类型错误:undefined不是函数;
- 如何在DOM元素上按类型构建此函数
- 同样,同样的错误'ahorcado.js:26未捕获类型错误:无法读取属性'beginPath'
- YUI3 IO实用程序是否可以根据给定的内容类型标头值自动序列化数据
- Webpack/Rect:遵循egghead.io教程,但出现错误:您可能需要一个合适的加载程序来处理此文件类型
- 如何从querySelectorAll中获取按钮类型
- 如何在输入字段中的按钮的帮助下打开日历,该字段的类型为“=”;日期”;
- 如何将具有文本类型值的var放入jQuery函数中
- javascript解释器如何理解变量的数据类型
- 可变大小的JavaScript字符串如何成为基元类型
- AngularJS指令只识别双向绑定类型
- 在<输入类型=“;文件“/>
- 从查询字符串参数推断出正确的数据类型
- 未捕获的类型错误:无法读取属性'删除'的未定义
- 为什么不'我们在javascript中使用函数参数的数据类型
- Javascript 可选类型提示
- 可以<脚本类型=“;text/javascript”>window.location=“/"</
- 未捕获的类型错误:无法读取属性'name'即使它存在,也无法定义
- html5视频中的Youtube类型注释
- JavaScript拥有OwnProperty与类型