开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第18天,点击查看活动详情
对象是我们在使用
JavaScript
中最常用的数据类型之一了,JavaScript
中 有一个万物皆对象的概念,就是我们使用各种类型的时候,都可以使用 点语法访问其原型属性和原型方法,而了解对象的静态方法 和 实例属性及方法 有助于我们更好的在业务中去处理各种场景,今天我们主要来了解一下实例属性及方法~
实例属性
所谓实例属性,就是我们构造函数上的实例化以后的对象上的属性喽,实例属性一共有两个
Object.prototype.constructor
constructor
属性返回Object
的构造函数(用于创建实例对象)。注意,此属性的值是对函数本身的引用,而不是一个包含函数名称的字符串。
- 这个方法我们一般很少用,用的时候也就是判断类型的时候了, 原始类型的值是只读的,不可以使用,除非是我们使用了构造函数生成的原始类型,那种也称之为包装对象~
const a = { }
const a1 = new Object
a.constructor === a1.constructor === Object // true
const b = []
const b1 = new Array
b.constructor === b1.constructor === Array // true
const c = new Date()
c.constructor === Date // true
// 对于构造函数生成的简单类型才可以使用这种方法来判断哦
const d = new Number(2)
d.constructor = Number // true
Object.prototype.__proto__
通过它访问的对象的内部
[[Prototype]]
(一个对象或null
)。
- 但是这个方法不推荐使用了,这个我记得在 2021 年的时候,火狐和谷歌浏览器在控制台显示这个特性 还是用 [[ ]] 来包裹的,2021 年年底的时候 这两个浏览器对他们的显示都做了改变, 我们可以用这个来判定原型链引用,但一般也用不到或不使用这个哦~
实例方法
实例方法就是我们构造函数中的实例方法喽,和我们上一篇分享的静态方法的区别就是实例方法是供给实例对象来使用的~
Object.prototype.hasOwnProperty()
返回一个布尔值,指示对象自身属性中是否具有指定的属性(也就是,是否有指定的键)。
- 这个方法主要是用来判断我们对象当中是否有该属性的,业务场景中会偶尔使用这个~,需要注意的是,这个方法只能判定自身属性不能判定继承属性,还有就是可枚举和不可枚举属性这个方法都可以判定哦,所以我们在业务中会使用
for in
循环来遍历对象,因为for in
只能遍历到对象的可枚举属性~
let obj = {a:1}
Object.defineProperty(a,'s',{
value:123124,
enumerable:false
})
obj.hasOwnProperty(a) // true
obj.hasOwnProperty(s) // true
// 使用 for 循环,过滤不可枚举属性
for(let key in obj){
if(obj.hasOwnProperty(key)){
// 这里就是过滤以后的了, 来处理我们的业务逻辑
}
}
Object.prototype.isPrototypeOf()
用于测试一个对象是否存在于另一个对象的原型链上。
- 这个我们在业务中用的也比较少啦,这个主要是针对原型链的查找,可能再使用了原型继承这种情况下,才会用着这个来判断的~ , 这个和
instanceof
是有区别的,后面我会专门出一篇用来分享数据类型的检测~
function Aoo() {}
function Bar() {}
function Baz() {}
Bar.prototype = Object.create(Aoo.prototype);
Baz.prototype = Object.create(Bar.prototype);
var baz = new Baz();
console.log(Baz.prototype.isPrototypeOf(baz)); // true
console.log(Bar.prototype.isPrototypeOf(baz)); // true
console.log(Aoo.prototype.isPrototypeOf(baz)); // true
console.log(Object.prototype.isPrototypeOf(baz)); // true
Object.prototype.propertyIsEnumerable()
返回一个布尔值,表示指定的属性是否可枚举。
- 在上面说到
hasOwnProperty
的时候,我们说了他会检测到对象的不可枚举属性,那么这个方法,就是用来检测对象中指定的属性是否可枚举的~
let a = {b:1}
Object.defineProperty(a,'s',{
value:123124,
enumerable:false
})
console.log(a.propertyIsEnumerable('b')); // ture
console.log(a.propertyIsEnumerable('s')); // false
Object.prototype.toLocaleString()
返回一个该对象的字符串表示。此方法被用于派生对象为了特定语言环境的目的(locale-specific purposes)而重载使用。
- 这个方法返回表示对象的字符串。 业务中使用概率几乎为0,但是一些包库偶尔会用到,针对对象,数组,和
Date
,都会调用不用的接口~ 所以我们暂不深入探究这个喽。
Object.prototype.toString()
返回一个表示该对象的字符串。该方法旨在重写(自定义)派生类对象的类型转换的逻辑。
- 这个方法就有意思了,这个是作为检测引用数据类型的标准方法之一,这个涉及到数据类型检测,我们直接在下一篇来拓展他~。
Object.prototype.valueOf()
- 看他的概念,可能有点晦涩难懂,但是这个涉及到隐式类型转换,隐式类型转换的时候,会调用这个 和
toString
和另一个方法, 在不同的情况下, 他和toString
方法的调用顺序会有区别,这个大家可以直接参考ECMAScript 的标准,什么情况下转换成什么~也可以到MDN 了解一下概念~