JS:Object静态对象

1.静态方法

  静态方法就是直接使用类名调用的方法,且静态方法是无法被子类继承或者实例对象拥有的

2.Object类的静态方法

  (1) Object.getPrototypeOf(obj) 获得obj的原型,也可以使用obj._ proto__属性获得obj的原型:

    可以看到对实例变量p使用getPrototypeOf方法可以得到Product.prototype,同时obj一般都是指实例对象,当然对类使用这个方法也可以,但得出的结果没有太大意义,可以自己试一试 Object.getPrototypeOf(Product) 。

  (2) Object.getOwnPropertyNames(obj) 可以将obj的可枚举和不可枚举的属性的名称组成一个数组返回

    实例对象有三个属性。注意只有直接在Product中定义的属性才会被列出来,并且必须是公共属性。

  (3) Object.defineProperty(obj,propName,desc) 该方法可以为obj新增一个名为propName的属性,同时它的属性定义为desc,desc使用一个对象赋值

    Object.defineProperty(Product.prototype,"a",{
    value: "a",
    wirtable : true,
    enumerable : true,
    configurable : true
});

以上就为Product的prototype新增了一个名为a的属性,设置它的值为a,可写,可枚举,可更改(可更改的意思是否可更改writable、enumerable等),默认都为true。上面的例子为Product.prototype增加了属性a,那么它所有新的实例对象都会增加这个属性。当然obj本省也可以是实例对象。使用这种方式定义一个新属性,可以自主控制属性的表现方式,如果将writable设置为false,这个属性将不可更改,例如:将属性a的writable设置为了false,然后更改它的值,虽然没有报错,但是它确实没有被更改,如果在 use strict 模式下,将抛出错误。

使用create方法新建一个实例对象o,它的父类是Product,它本身属于Object,同时设置size为只读属性。注意这种方式不是使用Product的构造函数新建的实例对象,所以o并没有name、desc等属性。

  (4) Object.create(proto,[props]) 以proto为原型,新建一个实例对象,同时将props定义的属性设置给这个新对象,以这种方式新建的对象都是Object类型,例如:

    var o = Object.create(Product.prototype,{
    size : {
        value : 7,
        writable : false,
        enumerable : true,
        configurable : false
     }
   });

 

  (5) Object.getOwnPropertyDescriptor(obj,propName) 返回obj的属性propName的属性描述符:

     如上面新建的实例对象o,获得它的属性size的属性描述符。

  (6) Object.preventExtensions(obj) 可以禁止obj对象的属性扩展,例如:

     将实例对象o设置为不可扩展,那么即时给它一个新属性name没有报错,但这个name属性并没有添加到它的定义中。同时size属性的configurable如果设置为true的话,可以使用delete o.size 删除size属性。注意没有preventExtensible的反相操作。

  (7) Object.seal(obj) 可以禁止obj对象的属性扩展和删除,它相对与preventExtensible方法而言 ,将所有属性的configurable属性设置为false。

  (8) Object.freeze(obj) 可以禁止对obj的所有操作,它相对与preventExtensible方法而言,将属性的configurable属性和writable属性都设置为了false,例如:如上,实例对象o将不可扩展,属性不可删除,不可更改。

  (9) Object.isExtensible(obj)、Object.isSealed(obj)、Object.isFrozen(obj) 分别对应了上述三个方法是否对obj进行了设置

 

posted on 2022-06-27 21:21  香香鲲  阅读(93)  评论(0编辑  收藏  举报