关于 JavaScript 对象你应该知道的

发布于 2021-12-07 12:43:19 字数 2391 浏览 952 评论 0

1. 如何判定一个对象上是否有某个属性

obj[attr] != undefined; //自有的 + 继承的 属性,不能判定属性值本身就是undefined的情况,和枚举无关
attr in obj; // 自有的 + 继承的 属性,和枚举无关
obj.hasOwnProperty(attr) // 自有的属性
obj.propertyIsEnumerable(attr) //自有的 & 可枚举的属性

2. 如何枚举一个对象上的属性

for(attr in obj); // 遍历 自有 + 继承的可枚举的属性
Object.keys(obj); //返回  自有的 & 可枚举的属性数组
Object.getOwnPropertyNames(obj); //返回 自有的属性,而不管是否可枚举

3. 属性的特性

对象上的属性具有如下三个特性

  • writable attribute:是否可以设置该属性的值
  • enumerable attribute:是否可以通过 for/in 循环返回该属性
  • configurable attribute:是否可以删除或修改该属性

如果是属性使用存储器来表示,那么它没有 writable attribute,多了 set 和 get 属性

  • getter attribute
  • setter attribute
  • enumerable attribute
  • configurable attribute

4. 判定属性的原型

ECAMScript 5 可以将对象作为参数传入 Object.getPrototypeOf() 中查询它的原型。

如下例子还会结合使用 o.constructor.prototype 的方式判断原型,可以看到它有时是不可靠的:

Case1 通过对象直接量创建的对象使用 Object.prototype 作为它的原型

var o = {};
o.constructor == Object;//true
o.constructor.prototype == Object.prototype;//true

Object.getPrototypeOf(o) == Object.prototype;//true
Object.prototype.isPrototypOf(o);//true

Case2 通过 new 创建的对象使用构造函数的 prototype 作为它的原型


var d = new Date();
d.constructor == Date;//true
d.constructor.prototype == Date.prototype;//true

Object.getPrototypeOf(d) == Date.prototype;//true
Date.prototype.isPrototypOf(d);//true

Case3 通过 create() 创建的对象使用第一个参数作为它的原型

var p = {x:1}
var o = Object.create(p);

o.constructor == Object;

o.constructor.prototype == Object.prototype;//true
o.constructor.prototype == p;//false

p.isPrototypeOf(o); // true  o继承自p
Object.prototype.isPrototypeOf(o);//true p继承自Object.prototype 跟预期会有偏差

Object.getPrototypeOf(o) == p;//true
Object.getPrototypeOf(o) == Object.prototype;//false

另外,从如下例子中可以看出,尽管我们改了构造函数 F 的 prototype,通过 constructor.prototype 访问到的仍旧是 Object.prototype,可见使用提供的方法判定 prototype 更靠谱:

function F(){};
F.prototype = {y: 1};
var o2 = new F();
o2.constructor.prototype === F.prototype; // false 
o2.constructor.prototype === Object.prototype; // true 
F.prototype.isPrototypeOf(o2); // true
Object.getPrototypeOf(o2) == F.prototype;//true

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

够钟

暂无简介

0 文章
0 评论
510 人气
更多

推荐作者

lorenzathorton8

文章 0 评论 0

Zero

文章 0 评论 0

萧瑟寒风

文章 0 评论 0

mylayout

文章 0 评论 0

tkewei

文章 0 评论 0

17818769742

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文