资讯专栏INFORMATION COLUMN

Javascript中的对象-Object

2shou / 2586人阅读

摘要:返回当前对象对应的值。判断当前对象是否为另一个对象的原型。存取器新的值必须大于当前值利用存取器,可以实现数据对象与对象的双向绑定。控制对象状态提供了三种方法,精确控制一个对象的读写状态,防止对象被改变。

Object对象的方法

当Object 被作为工具方法,而不是构造方法时,

Object(arg):包装方法,将非对象类型包装成一个对象

Object.create(proto[, propertiesObject]):

Object.getPrototypeOf(obj):

Object实例对象的方法

必须区分“构造函数的方法”和“实例对象的方法”。

valueOf():返回当前对象对应的值。

toString():返回当前对象对应的字符串形式。
这个方法很有用,可以用于判断对象类型

toLocalString():返回当前对象对应的本地字符串形式。

hasOwnProperty():判断某个属性是否为当前对象自身的属性,还是继承自原型对象的属性。

isPrototypeOf():判断当前对象是否为另一个对象的原型。

propertyIsEnumerable():判断某个属性是否可枚举。

对象的属性模型

Object.getOwnPropertyDescriptor():获取对象的属性的精确描述模型

Object.defineProperty()
Object.defineProperties()
这两个方法有性能损耗,会拖慢执行速度,不宜大量使用。

可枚举性(enumerable)

如果一个属性的enumerable为false,下面三个操作不会取到该属性。

for..in循环

Object.keys方法
JSON.stringify方法(有时可以利用这一点,为对象添加注释信息。)

因此,enumerable可以用来设置“秘密”属性。
遍历对象属性方法

Object.keys()

Object.getOwnPropertyNames()
一般情况下,几乎总是使用Object.keys方法,遍历数组的属性。

存取器
var o ={
  $n : 5,
  get next(){return this.$n++ },
  set next(n) {
    if (n >= this.$n) this.$n = n;
    else throw "新的值必须大于当前值";
  }
};

o.next // 5

o.next = 10;
o.next // 10

利用存取器,可以实现数据对象与DOM对象的双向绑定。

对象拷贝

对于简单属性,就直接拷贝,对于那些通过描述对象设置的属性,则使用Object.defineProperty方法拷贝。

var extend = function (to, from) {
  var descriptor = Object.getOwnPropertyDescriptor(from, property);

  if (descriptor && ( !descriptor.writable
    || !descriptor.configurable
    || !descriptor.enumerable
    || descriptor.get
    || descriptor.set)) {
    Object.defineProperty(to, property, descriptor);
  } else {
    to[property] = from[property];
  }
}
控制对象状态

JavaScript提供了三种方法,精确控制一个对象的读写状态,防止对象被改变。最弱一层的保护是preventExtensions,其次是seal,最强的freeze。

不可扩展对象(不能加,可改,可删)

Object.preventExtensions方法可以使得一个对象无法再添加新的属性。可以用delete命令删除它的现有属性。
判断: Object.isExtensible(obj);

密封的对象(不能加,删,可改)

Object.seal方法使得一个对象既无法添加新属性,也无法删除旧属性。

判断: Object.isSealed(obj);

冻结的对象(不能加,不能改,不能删)

Object.freeze方法可以使得一个对象无法添加新属性、无法删除旧属性、也无法改变属性的值,使得这个对象实际上变成了常量。
判断: Object.isFrozen(obj);

局限性: 需要注意的是,使用上面这些方法锁定对象的可写性,但是依然可以通过改变该对象的原型对象,来为它增加属性。

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

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

相关文章

  • JavaScript中的面向对象object-oriented)编程

    摘要:对象在中,除了数字字符串布尔值这几个简单类型外,其他的都是对象。那么在函数对象中,这两个属性的有什么区别呢表示该函数对象的原型表示使用来执行该函数时这种函数一般成为构造函数,后面会讲解,新创建的对象的原型。这时的函数通常称为构造函数。。 本文原发于我的个人博客,经多次修改后发到sf上。本文仍在不断修改中,最新版请访问个人博客。 最近工作一直在用nodejs做开发,有了nodejs,...

    JerryZou 评论0 收藏0
  • JavaScript 原型中的哲学思想

    摘要:而作为构造函数,需要有个属性用来作为以该构造函数创造的实例的继承。 欢迎来我的博客阅读:「JavaScript 原型中的哲学思想」 记得当年初试前端的时候,学习JavaScript过程中,原型问题一直让我疑惑许久,那时候捧着那本著名的红皮书,看到有关原型的讲解时,总是心存疑虑。 当在JavaScript世界中走过不少旅程之后,再次萌发起研究这部分知识的欲望,翻阅了不少书籍和资料,才搞懂...

    sugarmo 评论0 收藏0
  • 深入理解Javascript原型关系

    摘要:如下所示在规范中,已经正式把属性添加到规范中也可以通过设置和获取对象的原型对象对象之间的关系可以用下图来表示但规范主要介绍了如何利用构造函数去构建原型关系。 前言 在软件工程中,代码重用的模式极为重要,因为他们可以显著地减少软件开发的成本。在那些主流的基于类的语言(比如Java,C++)中都是通过继承(extend)来实现代码复用,同时类继承引入了一套类型规范。而JavaScript是...

    ethernet 评论0 收藏0
  • [译] 为什么原型继承很重要

    摘要:使用构造函数的原型继承相比使用原型的原型继承更加复杂,我们先看看使用原型的原型继承上面的代码很容易理解。相反的,使用构造函数的原型继承像下面这样当然,构造函数的方式更简单。 五天之前我写了一个关于ES6标准中Class的文章。在里面我介绍了如何用现有的Javascript来模拟类并且介绍了ES6中类的用法,其实它只是一个语法糖。感谢Om Shakar以及Javascript Room中...

    xiao7cn 评论0 收藏0
  • 【译】如何在 JavaScript 中使用对象的方法

    摘要:中的所有对象都来自父的构造函数。不同于数组的原型方法例如和只能被数组实例使用,对象方法直接来自构造函数,并使用对象实例作为参数。这称为静态方法。创建对象的键值对的嵌套数组。可用于确定对象是否已冻结,并返回布尔值。 原文:How To Use Object Methods in JavaScript作者:Tania Rascia译者:博轩 介绍 JavaScript 中,对象是 键/值 ...

    longmon 评论0 收藏0
  • javascript中的constructor&&prototype

    摘要:于是退而求其次叫为类的构造函数。如果这个函数被用在创建自定义对象的场景中,我们称这个函数为构造函数。遇到的问题始终指向创建当前对象的构造函数。 Object.constructor,prototype 对象的prototype和constructor是两个重要的属性,他们总是成对出现,提到constructor的地方,不得不涉及到另外一个非常重要的属性prototype,它是js中基于...

    huaixiaoz 评论0 收藏0

发表评论

0条评论

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