Object.getOwnPropertyDescriptor()和Object.getOwnPropertyDescriptors()还有Object.getPrototypeOf()

Object.getOwnPropertyDescriptor() 方法返回指定对象上一个自有属性对应的属性描述符。(自有属性指的是直接赋予该对象的属性,不需要从原型链上进行查找的属性)

  • 语法:Object.getOwnPropertyDescriptor(obj, prop)
  • 参数
    • obj:需要查找的目标对象
    • prop:目标对象内属性名称(String类型)
  • 返回值: 如果指定的属性存在于对象上,则返回其属性描述符对象(property descriptor),否则返回 undefined。
  • 描述:该方法允许对一个属性的描述进行检索。在 Javascript 中, 属性 由一个字符串类型的“名字”(name)和一个“属性描述符”(property descriptor)对象构成。更多关于属性描述符类型以及他们属性的信息可以查看:Object.defineProperty.

一个属性描述符是一个记录,由下面属性当中的某些组成的:

  • value:该属性的值(仅针对数据属性描述符有效)
  • writable:当且仅当属性的值可以被改变时为true。(仅针对数据属性描述有效)
  • get:获取该属性的访问器函数(getter)。如果没有访问器, 该值为undefined。(仅针对包含访问器或设置器的属性描述有效)
  • set:获取该属性的设置器函数(setter)。 如果没有设置器, 该值为undefined。(仅针对包含访问器或设置器的属性描述有效)
  • configurable:当且仅当指定对象的属性描述可以被改变或者属性可被删除时,为true。
  • enumerable:当且仅当指定对象的属性可以被枚举出时,为 true。

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
var o, d;
o = { get foo() { return 17; } };
d = Object.getOwnPropertyDescriptor(o, "foo");
// d {
// configurable: true,
// enumerable: true,
// get: /*the getter function*/,
// set: undefined
// }
o = { bar: 42 };
d = Object.getOwnPropertyDescriptor(o, "bar");
// d {
// configurable: true,
// enumerable: true,
// value: 42,
// writable: true
// }
o = {};
Object.defineProperty(o, "baz", {
value: 8675309,
writable: false,
enumerable: false
});
d = Object.getOwnPropertyDescriptor(o, "baz");
// d {
// value: 8675309,
// writable: false,
// enumerable: false,
// configurable: false
// }

注意事项

在 ES5 中,如果该方法的第一个参数不是对象(而是原始类型),那么就会产生出现 TypeError。而在 ES2015,第一个的参数不是对象的话就会被强制转换为对象。

1
2
3
4
5
6
7
8
9
Object.getOwnPropertyDescriptor('foo', 0);
// 类型错误: "foo" 不是一个对象 // ES5 code
Object.getOwnPropertyDescriptor('foo', 0);
// Object returned by ES2015 code: {
// configurable: false,
// enumerable: true,
// value: "f",
// writable: false
// }

Object.getOwnPropertyDescriptors() 方法用来获取一个对象的所有自身属性的描述符。

  • 语法:Object.getOwnPropertyDescriptors(obj)
  • 参数
    • obj:任意对象
  • 返回值:所指定对象的所有自身属性的描述符,如果没有任何自身属性,则返回空对象。

示例

浅拷贝一个对象

Object.assign() 方法只能拷贝源对象的可枚举的自身属性,同时拷贝时无法拷贝属性的特性们,而且访问器属性会被转换成数据属性,也无法拷贝源对象的原型,该方法配合 Object.create() 方法可以实现上面说的这些。

1
2
3
4
Object.create(
Object.getPrototypeOf(obj),
Object.getOwnPropertyDescriptors(obj)
);

创建子类

创建子类的典型方法是定义子类,将其原型设置为超类的实例,然后在该实例上定义属性。这可能会让尴尬,特别是对于 getters 和 setter 而言。 相反,您可以使用此代码设置原型:

1
2
3
4
5
6
7
8
function superclass() {}
superclass.prototype = {
// 在这里定义方法和属性
};
function subclass() {}
subclass.prototype = Object.create(superclass.prototype, Object.getOwnPropertyDescriptors({
// 在这里定义方法和属性
}));

Object.getPrototypeOf()

Object.getPrototypeOf() 方法返回指定对象的原型(内部[[Prototype]]属性的值)
语法:Object.getPrototypeOf(object)

Newer Post

java重定向问题

今天在开发雀巢水新需求的过程中,发现java部分是直接返回页面的,不是那种前台 ajax 调用接口返回值,以前没在意,直到新需求要求不同的商品对应不同的支付方式(蛋疼),水票还不能单独购买。好了。。。担心用户单独购买水票或者几种不同支付方式的商品一起购买,结果肯定不给跳到订单提交页的,但是由于后台接 …

继续阅读
Older Post

Web开发中的“黑话”

来自:https://segmentfault.com/a/1190000002593432 PolyfillPolyfill或者Polyfiller,是英国Web开发者 Remy Sharp 在咖啡店蹲坑的时候拍脑袋造出来的。当时他想用一个词来形容”用JavaScript(或者Flash之类的什么 …

继续阅读