js中的hasOwnProperty和isPrototypeOf方法

本文介绍了JavaScript中hasOwnProperty和isPrototypeOf方法的用法,详细解释了如何检查对象属性及原型链,并通过实例展示了具体应用。

hasOwnProperty:是用来判断一个对象是否有你给出名称的属性或对象。不过需要注意的是,此方法无法检查该对象的原型链中是否具有该属性,该属性必须是对象本身的一个成员。
isPrototypeOf是用来判断要检查其原型链的对象是否存在于指定对象实例中,是则返回true,否则返回false。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
function  siteAdmin(nickName,siteName){
             this .nickName=nickName;
             this .siteName=siteName;
         }
         siteAdmin.prototype.showAdmin = function () {
             alert( this .nickName+ "是" + this .siteName+ "的站长!" )
         };
         siteAdmin.prototype.showSite = function (siteUrl) {
             this .siteUrl=siteUrl;
             return  this .siteName+ "的地址是" + this .siteUrl;
         };
         var  matou= new  siteAdmin( "愚人码头" , "WEB前端开发" );
         var  matou2= new  siteAdmin( "愚人码头" , "WEB前端开发" );
         matou.age= "30" ;
//      matou.showAdmin();
//      alert(matou.showSite("http://www.css88.com/"));
         alert(matou.hasOwnProperty( "nickName" )); //true
         alert(matou.hasOwnProperty( "age" )); //true
         alert(matou.hasOwnProperty( "showAdmin" )); //false
         alert(matou.hasOwnProperty( "siteUrl" )); //false
         alert(siteAdmin.prototype.hasOwnProperty( "showAdmin" )); //true
         alert(siteAdmin.prototype.hasOwnProperty( "siteUrl" )); //false
         alert(siteAdmin.prototype.isPrototypeOf(matou)) //true
         alert(siteAdmin.prototype.isPrototypeOf(matou2)) //true
### 禁止在对象实例上直接使用这些方法的原因 #### 1. 原型链覆盖问题 当对象实例自身定义了与 `hasOwnProperty`、`isPrototypeOf`、`propertyIsEnumerable` 同名的属性或方法时,会覆盖原型链上的这些原生方法,导致调用时执行的是自定义的逻辑而非预期的原生方法逻辑。例如: ```javascript const obj = { hasOwnProperty: function() { return false; } }; console.log(obj.hasOwnProperty('someProp')); // 无论 someProp 是否为自身属性,都会返回 false ``` #### 2. 安全性问题 在处理不信任的对象时,直接调用这些方法可能会引发安全风险。如果对象被恶意篡改,包含了自定义的同名方法,可能会导致意外的行为,如信息泄露或执行恶意代码。 #### 3. 兼容性问题 在一些旧的 JavaScript 环境中,对象的原型链可能被修改,导致这些方法的行为不符合预期。 ### 解决方案 #### 1. 使用 `Object.prototype` 调用 可以通过 `Object.prototype` 来调用这些方法,避免对象实例自身的属性或方法覆盖原生方法。示例如下: ```javascript const obj = { hasOwnProperty: function() { return false; }, prop: 'value' }; console.log(Object.prototype.hasOwnProperty.call(obj, 'prop')); // true ``` #### 2. 使用 `Object.hasOwn()` 对于 `hasOwnProperty` 方法,可以使用 `Object.hasOwn()` 替代。`Object.hasOwn()` 旨在取代 `Object.prototype.hasOwnProperty()`,它直接检查对象自身是否具有指定的属性,而不受原型链的影响。 ```javascript const obj = { prop: 'value' }; console.log(Object.hasOwn(obj, 'prop')); // true ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值