标签:对象 查找 理解 原型 hasOwnProperty prototype 属性
目录原型链
- 原型对象
在 JavaScript 中,绝大多数的函数都有一个叫做 prototype
的属性,指向原型对象,
通过构造函数new出来的实例, 都可以共享访问原型对象的属性。
- 原型链
在JavaScript 中所有都是对象,每个对象都有一个 __proto__
属性,这个属性指向了当前对象的构造函数的原型。对象可以通过自身的 __proto__
属性访问构造函数的原型对象,原型对象也有 __proto__
,访问原型的原型,向上查找,直到找到Object.prototype,因此这样就串联形成一个链式结构,也就是我们称为的原型链。
- 属性的区分
通过 hasOwnProperty()
函数来实现
let person = {
name: "Tom",
age: 18,
job: "student"
}
console.log(person.hasOwnProperty("name")) // true
console.log(person.hasOwnProperty("hasOwnProperty")) // false
console.log(Object.prototype.hasOwnProperty("hasOwnProperty")) // true
name
属性为实例属性,在调用hasOwnProperty
方法时,会返回true
。hasOwnProperty
属性为原型对象上的属性,在调用hasOwnProperty
函数时,会返回false
.
在使用for...in
运算符,遍历对象的属性时,一般可以配合hasOwnProperty
方法一起使用,检测某个属性是否为对象自身的属性,如果是,可以做相应的处理。
for(var p in person){
if(person.hasOwnProperty(p)){
}
}
- 原型链特点
第一个特点:由于原型链的存在,属性查找的过程不再只是查找自身的原型对象,而是会沿着整个原型链一直向上,直到追溯到Object.prototype
.也就是说,当js
引擎在查找对象的属性时,先查找对象本身是否存在该属性,如果不存在,会在原型链上查找,直到Object.prototype
.如果Object.prototype
上也找不到该属性,则返回undefined
,如果期间在对象本身找到了或者是某个原型对象上找到了该属性,则会返回对应的结果。
由于这个特点,我们在自定义的对象中,可以调用某些未在自定义构造函数中定义的函数,例如toString( )
函数。
function Person(){ }
var p = new Person();
p.toString(); // 实际上调用的是Object.prototype.toString( )
第二个特点:由于属性查找会经历整个原型链,因此查找的链路越长,对性能的影响越大。
标签:对象,查找,理解,原型,hasOwnProperty,prototype,属性 来源: https://www.cnblogs.com/xiayuxue/p/16611818.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。