资讯专栏INFORMATION COLUMN

Javascript Object方法详解

sushi / 584人阅读

摘要:创建对象创建一个普通对象创建一个没有原型的新对象不继承任何属性和方法返回对象中可枚举的自我属性的名称的数组返回对象中所有自我属性的名称的数组属性的特性属性有两种特性数据属性和存取器属性数据属性存取器属性可以获得某个对象特定自有属性的属性描述

Object.create(o)

创建对象

Object.create({x: 1}) //创建一个普通对象
Object.create(null) //创建一个没有原型的新对象, 不继承任何属性和方法
Object.keys(o)

返回对象中可枚举的自我属性的名称的数组

Object.getOwnPropertyNames(o)

返回对象中所有自我属性的名称的数组

属性的特性

属性有两种特性, 数据属性和存取器属性
数据属性: {value: , writable, enumerable, configurable}
存取器属性: {get: , set, enumerable, configurable}

Object.getOwnPropertyDescriptor(o, prop)

可以获得某个对象特定自有属性的属性描述符

Object.getOwnPropertyDescriptor({x:1}, "x")

==>

Object {value: 1, writable: true, enumerable: true, configurable: true}

若想要获取继承属性的属性描述符, 需要遍历原型链(Object.getProtytypeOf())

Object.defineProperty
Object.defineProperty({}, "x", {
                            value: 1, //值
                            writable: true,    
                            enumerable: true,
                            configurable: true
                        }
Object.defineProperty({}, {
    x: { value: 1, writable: true, enumerable: true, configurable: true},
    x: { value: 2, writable: true, enumerable: true, configurable: true},
    r: {
        get: function() { return Math.max(this.x, this.y)},
        enumerable: true, 
        configurable: true
    }
})

configuration = false 时为 不可配置
如果存取器属性是不可配置的, 则不能修改get和set, 也不能转换为数据属性
如果数据属性是不可配置的, 则不能转换为存取器属性
如果数据属性是不可配置的, 则不能将writable从false->true, 但是可以从true->false
如果数据属性是不可配置且为可写时, 则不能修改它的值, 然而可配置但不可写时, 值是可以修改的(实际上是先把可写性转成true, 修改值后, 再改为false)

完整复制属性特性的extend方法

Object.defineProperty(Object.prototype,
    "extend",
    {
        writable: true,
        enumerable: false,
        configurable: true,
        value: function(o){
            //获取所有可枚举的自有属性
            var names = Object.getOwnPropertyNames(o);
            for(var i = 0; i < names.length; i++){
                if (names[i] in this) continue;
                //获取属性描述符
                var desc = Object.getOwnPropertyDescriptor(o, names[i]);
                //定义属性
                Object.defineProperty(this, names[i], desc);
            }
        }
    }
);

注:
ECMAScript 5 之前的非标准方法
lookupGetter
lookupSetter
defineGetter
defineSetter

Object.isPrototypeOf()

查询原型
注: Firefox, Safari和Chrome支持__proto__查询, IE和Opera不支持

Object.esExtensible(o)

判断对象是否是可扩展的

Object.preventExtensions(o)

把对象转为不可扩展的

Object.seal(o)

在preventExtensions的基础上, 将所有自有属性设置为不可配置的,即不能添加新属性, 且不能改已有属性, 可以用Object.isSealed来检测

Object.freeze(o)

对象冻结, 在seal的基础上, 将自有的所有数据属性设置为只读, 可以用Object.isFrozen()来检测

Object.assign

浅层复制, 主要用于对象的扩展

Object.prototype

一般只有function对象拥有prototype属性
__proto__是原型链的实际指针

// 原型链的顶端
log((Object.prototype).__proto__);                                      // null
log(Function.prototype.__proto__ == Object.prototype);                  // true
log(Object.__proto__            == Function.prototype);                 // true
log(Function.__proto__          == Function.prototype);                 // true
log(Array.__proto__             == Function.prototype);                 // true
log(Company.__proto__           == Function.prototype);                 // true
log(Object.__proto__            == Function.prototype);                 // true
log(Company.prototype.__proto__ == Object.prototype);                   // true
log(c1.__proto__                == Company.prototype);                  // true

数据摘自 http://2660311.blog.51cto.com/2650311/1358226/
hasOwnProperty

用来检测给定的名字是否是对象的自有属性, 对于继承的属性将返回false.

var o = {x: 1}
o.hasOwnProperty("x")        // true: o有个自有属性x
o.hasOwnProperty("y")        // false: o中不存在属性y
o.hasOwnProperty("toString") // false: toString是继承属性

in 可以区分不存在的属性和存在但值为undefined的属性

var o = {x: undefined}
"x" in o // true, 属性存在
"y" in o //false, 属性不存在
delete o.x;
"x" in o //false, 已删除, 不存在
propertyIsEnumerable

是hasOwnProperty的增加版, 只有检测到是自有属性且可枚举(enumerable==true)时才返回true

var o = {x: 1}
o.propertyIsEnumerable("x") //true
Object.prototype.propertyIsEnumerable("toString") //false, 不可枚举
toString和toLocalString

通常来说, toLocalString会直接调用toString的值返回, 除了特殊的几个对象外:
Date, Number 会做本地化的转换
Array, Array在做toLocalString的时候会调每个元素的toLocalString, 而非toString

valueOf

valueOf和toString方法非常类似, 只有当需要转换成对象的某种原始值, 而非字符串时才会调用, 尤其是在Date和Number.

本文以学习为主, 主要资源来自于<>

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/86336.html

相关文章

  • javascript对象原型成员详解

    摘要:和的作用一样,区别在于写法语法对象对象作用判断对象是否在对象的原型链上语法对象构造函数作用判断构造函数的属性是否在对象的原型链上,如果在,就返回属性是否可枚举用于检查给定的属性是否能够使用语句。 ## javascript对象原型成员详解 ## ECMAScript 中的对象就是一组数据和功能的集合,对象可以通过 new 操作符后跟要创建的对象名称来...

    zhkai 评论0 收藏0
  • 温故js系列(17)-详解加法运算符

    摘要:数字和解释因为没有任何一个操作数是字符串,将转换为一个数字做数字加法运算因为没有操作数是对象或字符串,将转换为。结论以避免潜在的问题,不使用加法运算符处理对象,除非你清楚地使用或方法。 前端学习:教程&模块化/规范化/工程化/优化&工具/调试&值得关注的博客/Git&面试资源汇总 JavaScript一路走来,备受争议,与其说它备受争议,不如说它不够完美。不够完美?那完美了还得了,它的...

    gxyz 评论0 收藏0
  • JavaScript 运算符规则与隐式类型转换详解

    摘要:我们再来回顾下文首提出的这个比较运算,首先为对象,则调用函数将其转化为字符串对于右侧的,首先会进行显式类型转换,将其转化为。 JavaScript 运算符规则与隐式类型转换详解 从属于笔者的现代 JavaScript 开发:语法基础与工程实践系列文章,主要探讨 JavaScript 中令人迷惑的加减乘除与比较等常见运算中的规则与隐式类型转换;本文中涉及的参考资料全部声明在了JavaSc...

    snifes 评论0 收藏0
  • JavaScript 运算符规则与隐式类型转换详解

    摘要:我们再来回顾下文首提出的这个比较运算,首先为对象,则调用函数将其转化为字符串对于右侧的,首先会进行显式类型转换,将其转化为。 JavaScript 运算符规则与隐式类型转换详解 从属于笔者的现代 JavaScript 开发:语法基础与工程实践系列文章,主要探讨 JavaScript 中令人迷惑的加减乘除与比较等常见运算中的规则与隐式类型转换;本文中涉及的参考资料全部声明在了JavaSc...

    Kyxy 评论0 收藏0
  • 详解javascript的类

    摘要:原文地址详解的类博主博客地址的个人博客从当初的一个弹窗语言,一步步发展成为现在前后端通吃的庞然大物。那么,的类又该怎么定义呢在面向对象编程中,类是对象的模板,定义了同一组对象又称实例共有的属性和方法。这个等同于的属性现已弃用。。 前言 生活有度,人生添寿。 原文地址:详解javascript的类 博主博客地址:Damonare的个人博客   Javascript从当初的一个弹窗语言,一...

    hufeng 评论0 收藏0

发表评论

0条评论

sushi

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<