如果我理解正确,Javascript中的每个对象都继承自Object原型,这意味着Javascript中的每个对象都可以通过其原型链访问hasOwnProperty函数.
在阅读require.js的源代码时,我偶然发现了这个函数:
function hasProp(obj, prop) {
return hasOwn.call(obj, prop);
}
Run Code Online (Sandbox Code Playgroud)
hasOwn
是一个参考Object.prototype.hasOwnProperty
.写这个函数是否有任何实际的区别
function hasProp(obj, prop) {
return obj.hasOwnProperty(prop);
}
Run Code Online (Sandbox Code Playgroud)
既然我们在这,我们为什么要定义这个功能呢?这只是一个快捷方式和本地缓存属性访问(轻微)性能提升的问题,还是我错过了任何可能在没有此方法的对象上使用hasOwnProperty的情况?
if (someVar.hasOwnProperty('someProperty') ) {
// do something();
} else {
// do somethingElse();
}
Run Code Online (Sandbox Code Playgroud)
什么是正确的使用/解释hasOwnProperty('someProperty')
?
为什么我们不能简单地someVar.someProperty
用来检查对象是否someVar
包含具有名称的属性someProperty
?
在这种情况下,什么是财产?
这个javascript检查什么属性?
新方法Object.hasOwn()
返回一个布尔值,指示指定对象是否将指定属性作为其自己的属性,但也有Object.prototype.hasOwnProperty()
,它们之间有什么区别,使用其中一个相对于另一个有什么好处?
javascript prototypal-inheritance javascript-objects hasownproperty
这看起来很奇怪.
这是我在IE8控制台中的实验:
typeof obj1 // "object"
obj1.hasOwnProperty // {...}
typeof obj2 // "object"
obj2.hasOwnProperty // undefined
Run Code Online (Sandbox Code Playgroud)
关于什么可能导致这个问题的任何想法?
javascript internet-explorer-8 ie-developer-tools hasownproperty
在我看来,有四种不同的方法可以确定给定的对象(例如foo
)是否具有bar
定义的给定属性(例如):
if (foo.hasOwnProperty(bar)) {
if ('bar' in foo) {
if (typeof foo.bar !== 'undefined') {
if (foo.bar === undefined) {
要确定对象中是否存在名为" bar
"的属性foo
,这些语句中的所有三个都是等效的吗?是否有任何我不知道的sublte语义会使这三个语句中的任何一个不同?
我有以下代码:
let show = {
createTag: false,
updateFeature: false,
createFeatureGroup: false,
deleteFeature: false,
deleteCycle: false,
};
Run Code Online (Sandbox Code Playgroud)
我从查询字符串中获取一个值,我想将其与 show 的键进行匹配。
下面的代码工作正常,但我想要一种方法让 Typescrpt 推断它并避免必须发出强制转换:
const showDialog = $page.query.get('show') || '';
if (showDialog && showDialog in show) {
// I want to get rid of the "<keyof typeof show>" cast
show[<keyof typeof show>showDialog] = true;
}
Run Code Online (Sandbox Code Playgroud)
我虽然只是发出showDialog in show
打字稿就会知道 showDialog 里面if
是 的键show
,但情况似乎并非如此。
因为hasOwnProperty有一些警告和怪癖(窗口/广泛使用ie8问题/等).
我想知道是否有任何理由甚至使用它,如果只是测试一个属性是否未定义更合理和更简单.
例如:
var obj = { a : 'here' };
if (obj.hasOwnProperty('a')) { /* do something */ }
if (obj.a !== undefined) { /* do something */ }
// or maybe (typeof (obj.a) !== 'undefined')
Run Code Online (Sandbox Code Playgroud)
只是想知道是否有人对此有任何好的见解,我更愿意使用最跨浏览器的友好和最新的方法.
我也看过这个原型覆盖了hasOwnProperty,它起作用了,但我没有卖掉它的实用性......
if (!Object.prototype.hasOwnProperty) {
Object.prototype.hasOwnProperty = function(prop) {
var proto = this.__proto__ || this.constructor.prototype;
return (prop in this) && (!(prop in proto) || proto[prop] !== this[prop]);
};
}
Run Code Online (Sandbox Code Playgroud) 根据hasOwnProperty()
方法文档,我写了以下内容:
const myObj = {
prop1: 'val1',
prop2: 'val2'
}
if (!myObj.hasOwnProperty('prop3')) {
myObj.prop3 = 'val3'
}
Run Code Online (Sandbox Code Playgroud)
但我收到这个错误:
不要从目标对象访问 Object.prototype 方法“hasOwnProperty”
如果与文档中的相同,为什么它不起作用,以及如何修复它?
我知道hasOwnProperty
JavaScript 中的方法只用于识别当前类型的属性,但是原型链中有一些东西让我感到困惑.
让我们假设我定义了一个名为Bob的类型,并以两种不同的方式为我的Bob类型分配两个子函数:
function Bob()
{
this.name="Bob";
this.sayGoodbye=function()
{
console.log("goodbye");
}
}
Bob.prototype.sayHello= function()
{
console.log("hello");
}
Run Code Online (Sandbox Code Playgroud)
现在,除了可以访问闭包范围之外,在sayGoodbye
我看来,属于Bob
该类的两个函数应该或多或少相等.但是,当我查找它们时,hasOwnProperty
就JavaScript而言它们并不相同:
var myBob = new Bob();
console.log( myBob.name ); // Bob, obviously
console.log( myBob.hasOwnProperty("sayHello")); // false
console.log( myBob.hasOwnProperty("sayGoodbye")); // true
console.log( "sayHello" in myBob ); // true
Run Code Online (Sandbox Code Playgroud)
在范围方面发生了什么?如果没有和它连接Bob
的属性,我无法创建该类型的实例,那么为什么原型方法是关注的二等公民呢?是一种独立于类型存在的类型,从哪个类继承所有东西?sayHello()
sayGoodbye()
hasOwnProperty
Bob.prototype
Bob
Bob
在某些浏览器(Chrome,Safari浏览器),Object.keys()
不返回所有的按键时for-in循环与hasOwnProperty()
回报.
有没有使用for-in循环的解决方法?
还有另一个对象,window
它表现出同样的错误,或者只是window
对象的问题,因为我的测试往往显示?
两者都应该只返回自己的和只有可枚举的属性,因为我们可以从文档中读取:
hasOwnProperty()
:" 一种用于... in循环只遍历枚举.性能 "和hasOwnProperty()
过滤掉原型链继承属性,保持只在自己的属性.Object.keys()
:" 将返回其可枚举自身属性的对象. "结论:他们应该迭代相同的键:只有可枚举和自己的属性.
1)Firefox 39:没有丢失密钥
2)Chromium 38:47缺少键:
["speechSynthesis", "localStorage", "sessionStorage", "applicationCache", "webkitStorageInfo", "indexedDB", "webkitIndexedDB", "crypto", "CSS", "performance", "console", "devicePixelRatio", "styleMedia", "parent", "opener", "frames", "self", "defaultstatus", "defaultStatus", "status", "name", "length", "closed", "pageYOffset", "pageXOffset", …
Run Code Online (Sandbox Code Playgroud) hasownproperty ×10
javascript ×8
object ×3
casting ×1
for-in-loop ×1
jquery ×1
key ×1
prototype ×1
requirejs ×1
typescript ×1
undefined ×1