• 对象的三个属性

    • 原型属性

      1、var v={}的原型是Object.prototype;继承了一个constructor属性指代Object()构造函数,实际的原型是constructor.prototype
      2、var v = new Person()的原型是构造函数Person()的prototype属性;继承了一个constructor属性指代构造函数Person();
      3、Object.create()创建的对象使用第一个参数(也可以是null)作为对象的原型;也继承了一个constructor属性指代Object()构造函数,但真正原型往往不是。
      4、通过原型继承创建一个新对象 原型为p

      //通过原型继承创建一个新对象  原型为p
      function inherit(p){
      if(p==null){
      throw TypeError();
      }
      if(Object.create){
      return Object.create(p);
      }else{
      var t= typeof(p);
      if(t!=="object" && t!== "function"){
      throw TypeError();
      }else{
      function f(){};
      f.prototype=p;
      return new f();
      }
      }
      }

      5、在ECMAScript5中,使用Object.getPrototypeOf(obj)查询对象的原型; 在ECMAScript3中,使用obj.constructor.prototype来检测对象的原型;
      6、 isPrototypeOf() 检测对象是否是另一个对象的原型(或处于原型链中)。_proto_属性并不推荐使用,有诸多限制。

      var o={x:1};
      var o1 = Object.create(o);
      console.log(o.isPrototypeOf(o1)); //true
      console.log(Object.prototype.isPrototypeOf(o1)); //true
    • 类属性
      对象的类属性是一个字符串,用以标识对象的类型信息。不能设置,可以通过toString()方法查询(这个方法继承自Object.prototype),然后提取第8个到倒数第2个位置之间的字符。
      但是,由于很多toString()方法都被重写了,因此需要调用call()方法返回该对象的类。
      //写一个处理函数
      function classof(o){
      if(o===null) return "Null";
      if(o===undefined) return "Undefined";
      return Object.prototype.toString.call(o).slice(8,-1);
      }
      console.log(classof(null)); // Null
      console.log(classof(1)); // Number
      console.log(classof("")); // String
      console.log(classof(false));// Boolean
      console.log(classof({})); // Object
      console.log(classof([])); // Array
      console.log(classof(/./)); //RegExp
      console.log(classof(new Date())); // Date
      console.log(classof(window)); //Window客户端宿主对象
      function f(){}; //自定义构造函数
      console.log(classof(new f())); // Object
    • 可扩展性
      1、对象的可扩展性用以表示是否可以给对象添加新属性。所有内置对象和自定义对象都是可扩展的,宿主对象的可扩展性是由JavaScript引擎定义的。
      2、通过Object.isExtensible(obj)来判断该对象是够可以扩展。
      通过Object.preventExtensions(obj)将对象转换为不可以扩展,但可以通过原型继续继承
      (意思是给该对象的原型添加属性,该对象同样会继承这些新属性)。
      3、可扩展的目的是将对象进行锁定,避免外界干扰。通常与对象对象的可配值性和可写性配合使用。
      4、通过Object.seal()方法封闭对象,使用Object.isSealed()检测对象是否封闭。
      5、通过Object.freeze()方法更严格的冻结对象,使用Object.isFrozen()方法来检测对象是否冻结。冻结对setter方法无效。
      6、Object.preventExtensions()、Object.seal()、Object.freeze()均返回传入的对象 可以通过函数嵌套的方式调用他们。
      var o = Object.seal(Object.create(Object.freeze({x:1}),{y:{value:2,writable:true}}));
      console.log(o); //{y:2} 
  • 序列化对象

    对象的序列化是指将对象的状态转换为字符串,也可以将字符串还原为对象。

    //序列化对象在ECMA3中实现需要引入json2.js文件
    var o = {x:1,y:{z:[false,null,""]}};//定义一个测试对象
    var s = JSON.stringify(o); //序列化对象 ,只能搞定对象可枚举的自有属性,不能序列化的将忽略掉
    var p = JSON.parse(s); //反序列化 p是o的深拷贝
  • 对象的方法:除了自定义,主要来自继承自Object.prototype里的对象方法

    • toString()方法:返回表示调用这个方法的对象值得字符串。默认的toString()方法返回值信息量很少,大部分需要自定义类重写这个方法。
    • toLocaleString()方法:返回表示这个对象的本地化字符串。Object中默认的toLocaleString()方法不做任何本地化自身的操作,仅调用toString(),象数字、日期、时间有本地化的转换。数组中的每个元素会调用toLocaleString()方法转换为字符串。
    • toJSON()方法:一般没用,只是在执行序列化方法JSON.stringify()方法的时候调用了一下toJSON();返回值是序列化的结果。参见Date.toJSON();
    • valueOf()方法:基本和toString()方法类似,需要将对象转换为某种原始值而非字符串的时候调用,如转为数字的时候。很多内置类自定义了这个方法,如Date.valueOf();

总结:

            //定义一个测试对象
var o = {x:1,y:{z:[false,null,""]}};
//instanceof表示是否是某个构造函数的实例
console.log(o instanceof Object);
//获得对象的原型
console.log(Object.getPrototypeOf(o));
//设置对象的原型,返回一个新对象
//参数第一个是现有对象,第二个是原型对象。等同于var b = {__proto__: o};
var b = Object.setPrototypeOf({}, o);
//检测自有属性的方法
console.log(o.hasOwnProperty("x"));
//检测可枚举的自有属性的方法
console.log(o.propertyIsEnumerable("x"));
//返回一个数组,由对象中可枚举的自有属性的名称组成
console.log(Object.keys(o));
//返回一个数组,由对象中所有自有属性的名称组成
console.log(Object.getOwnPropertyNames(o));
//获得自有属性的特性
console.log(Object.getOwnPropertyDescriptor(o,"x"));
//设置属性的特性Object.defineProperty Object.defineProperties()
Object.defineProperty(o,"x",{value:"欧红",writable:true,numerable:false,configurable:true});
Object.defineProperties(o,
{
"x":{value:"欧红",writable:true,numerable:false,configurable:true},
"y":{value:18,writable:true,numerable:false,configurable:true}
}
);
//封闭对象的属性:可以修改但是不能删除和扩展
Object.seal(o);
//冻结对象的属性:不能修改 删除 扩展
Object.freeze(o);
//Object构造函数里定义的静态函数 创建一个新对象
var o1 = Object.create(o);
//true 判断是否是原型
console.log(o.isPrototypeOf(o1));
console.log(Object.prototype.isPrototypeOf(o1));
//判断是否能扩展
console.log(Object.isExtensible(o));
//将对象转换为不可扩展
Object.preventExtensions(o);
//序列化对象 ,只能搞定对象可枚举的自有属性,不能序列化的将忽略掉
var s = JSON.stringify(o);
//反序列化 p是o的深拷贝
var p = JSON.parse(s);
//获取对象的类属性
function classof(o){
if(o===null) return "Null";
if(o===undefined) return "Undefined";
return Object.prototype.toString.call(o).slice(8,-1);
}

JavaScript的进阶之路(四)理解对象2的更多相关文章

  1. JavaScript学习笔记(十四)——对象

    在学习廖雪峰前辈的JavaScript教程中,遇到了一些需要注意的点,因此作为学习笔记列出来,提醒自己注意! 如果大家有需要,欢迎访问前辈的博客https://www.liaoxuefeng.com/ ...

  2. JavaScript的进阶之路(四)理解对象1

    对象是JavaScript的基本数据类型.简单的名值对组成了对象,BUT:还可以从一个被称为原型的对象继承属性,对象的方法通常就是继承的属性. 对象最常见的用法有:创建.设置.查找.删除.检测.枚举它 ...

  3. JavaScript的进阶之路(六)理解函数

    函数:定义一次,多次调用:用于对象的属性则称为对象的方法:在JavaScript中,函数即对象:嵌套的函数形成闭包: 定义函数和简单调用函数: //函数定义 function f1(){ //没有参数 ...

  4. JavaScript的进阶之路(五)理解数组1

    数组是值得有序结合,每个值叫做一个元素,每个元素的位置称为索引,索引从0开始. 在JavaScript中,数组是对象的特殊形式.继承自Array.prototype中的属性,有丰富的数组操作方法. 通 ...

  5. JavaScript的进阶之路(五)理解数组2

    数组方法 //定义一个测试数组 var array1 = [1,2,5,null,"a"]; //join()方法是String.split()方法的逆操作,后者是将字符串分割成若 ...

  6. 深入理解javascript函数进阶系列第四篇——惰性函数

    前面的话 惰性函数表示函数执行的分支只会在函数第一次调用的时候执行,在第一次调用过程中,该函数会被覆盖为另一个按照合适方式执行的函数,这样任何对原函数的调用就不用再经过执行的分支了.本文将详细介绍惰性 ...

  7. JavaScript正则进阶之路——活学妙用奇淫正则表达式

    原文收录在我的 GitHub博客 (https://github.com/jawil/blog) ,喜欢的可以关注最新动态,大家一起多交流学习,共同进步,以学习者的身份写博客,记录点滴. 有些童鞋肯定 ...

  8. 《JavaScript高级程序设计》读书笔记 ---理解对象

    上一章曾经介绍过,创建自定义对象的最简单方式就是创建一个Object 的实例,然后再为它添加属性和方法,如下所示.var person = new Object();person.name = &qu ...

  9. JavaScript的进阶之路(七)客户端JavaScript知识点总结

    一.客户端JavaScript主要是BOM DOM的操作和js脚本的兼容性.互用性.可访问性.安全性的应用.以及一些框架的引用. 二.BOM:浏览器对象模型 主要介绍window对象 1.定时器:se ...

随机推荐

  1. How to manage local libraries in IntelliJ IDEA

    如何在 IntelliJ IDEA 中管理本地类库 一般来说,如果项目是基于 Maven 管理工具的,我们会在 pom.xml 中添加 dependency 来管理依赖.但有时也会遇到要用的类库不在 ...

  2. 说说MySQL权限

    前言 今天继续MySQL系列文章,讲讲MySQL权限相关的内容.我们都知道,在写系统的时候,都会有权限相关的服务,以达到权限控制的目的.以最简单的权限菜单为例: 管理员拥有最大权限,可以查看系统下所有 ...

  3. FJWC2019 全连

    题目描述 有n个音符,第i个音符会在第i个时刻来临 令第 i 个音符的准备时间为 ti​ 个单位时间,如果选择去点击第 i 个音符,那么就没法点击所有到来时刻在 (i−ti​ ,i+ti​)中的音符. ...

  4. 【Alpha】Phylab 展示博客

    目录 Phylab Alpha 展示博客 一.团队简介 二.项目目标 2.1 典型用户 2.2 功能描述 2.3 用户量 三.项目发布与展示 3.1 新功能 3.2 修复缺陷 3.3 问题与限制 3. ...

  5. PKUWC2019退役记

    PKUWC2019 退役记 \(day1\): 进场看T1,发现是个对于所有边的子集求权值和的计数题,以为是个主旋律那样的神仙容斥,完全不会做(退役flag*1).T2是个和虚树有关的计数题,第一个s ...

  6. 【性能压测】:MQ队列异步处理机制导致的系统无法接受请求的问题

    一,最近压测系统交易峰值时,因该支交易采用MQ异步队列处理机制:该增加积分的交易,前段服务器优先返回给客户增加积分成功的结果,后端的MQ队列服务器再慢慢处理该请求: 二,压测过程中出现的问题现象:前几 ...

  7. HLS:跑马灯实验

    跑马灯实验的第一部分记录: 1. vivado 2018.2的HLS在跑C/RTL co-simulation的时候,一直报错,不论是用modelsim 还是vivado自带的similator.使用 ...

  8. MONO MessageBox 类

    MessageBox类,负责提示各种消息.   using System; using Android.App; using Android.Content; namespace Box { publ ...

  9. Fetch使用方法

    前言: fetch是用来取代传统的XMLHttpRequest的. 它的优点很多,包括链式调用的语法.返回promise等. 什么是fetch? fetch api是基于promise的设计,它是为了 ...

  10. 【Maven学习】远程仓库的配置

    很多情况下,默认的中央仓库无法满足项目的需求,我们可能需要配置新的远程仓库,此时我们可以这样配置: <repository> <id>java-net</id> & ...