Js原型与in操作符

介绍

in操作符主要用来判断对象属性是否存在,或者用来获取对象的可枚举的属性。
所以该操作符主要有两种使用方式:

  1. .单独使用时,用来判断对象属性是否存在,无论是存在实例中还是原型中,返回true或者false
  2. 在for-in循环中,获取对象的所有可访问的、可枚举的属性。

单独使用

用来判断是否存在可访问的属性

function Person() {

}
Person.prototype.name = '张三';
Person.prototype.sayName = function () {
  alert(this.name);
};
// 验证
let person1 = new Person();
let person2 = new Person();
// 1. 来自原型上
console.log(person1.hasOwnProperty('name'));    // false
console.log('name' in person1);     			// true
// 2. 来自实例上
person1.name = '李四';
person1.age = 26;
console.log(person1.hasOwnProperty('name'));    // true
console.log('name' in person1);     			// true
console.log('age' in person1);      			// true
// 3. 不可枚举属性
console.log('constructor' in person1);      	// true

所以,使用hasOwnProperty() 方法和 in 操作符,就可以判断属性是存在对象中还是存在对象的原型上

function hasPrototypeProperty(object, name) {
	return !object.hasOwnProperty(name) && (name in object);
}

在for-in循环中

用来枚举对象的可枚举属性,包括实例中的属性,也包括原型中的属性。
屏蔽了原型中不可枚举属性的实例属性也会返回,根据规定,开发人员定义的属性都是可枚举的,只有在IE8及更早的版本中例外。

function Person() {

}
Person.prototype.name = '张三';
Person.prototype.sayName = function () {
  alert(this.name);
};
// 验证
let person1 = new Person();
let person2 = new Person();

person2.toString = function () {}; // 屏蔽了原型的中toString
for (let prop in person2) {
	console.log(prop);
}
// toString, name, sayName  (IE8及更早的版本中不会出现toString)
具有相似功能的方法

Object.keys() :获取所有可枚举的实例属性。
Object.getOwnPropertyNames() : 获取所有的实例属性,无论是否可枚举。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值