1、属性的标志和描述符

  属性的标志

  对象属性除value外还有三个特殊属性,即标志

  writable ----如果为true,则可以修改,否则它只是只读的。

  enumerable ----如果为true,则可在循环中列出,否则不列出。

  configurable -----如果为true,则此属性可以被删除,相应的特性也可以被修改,否则不可以

  得到这些标志的语法:

  let descriptor = Object.getOwnPropertyDescriptor(obj,propertyName);

  obj   需要获取信息的对象

  propertyName   属性的名称

  let user = {

    name : "Jhon"

  };

  let descriptor = Object.getOwnPropertyDescriptor(user,'name');

  alert(JSON.stringify(descriptor,null,2));

  /* property descriptor:
  {
      "value": "John",
      "writable": true,
      "enumerable": true,
      "configurable": true
  }
  */

  标志修改语法:Object.defineProperty(obj,propertyName,descriptor)

  

 let user = {};

 Object.defineProperty(user, "name", {
value: "John"
}); let descriptor = Object.getOwnPropertyDescriptor(user, 'name'); alert( JSON.stringify(descriptor, null, ) );
/*
{
"value": "John",
"writable": false,
"enumerable": false,
"configurable": false
}
*/

  设置属性只读

  let user = {

    name : "Jhon"

  };

  Object.defineProperty(user,"name",{

    writable:false

  });

  user.name = "XiaoMing";//错误,不能设置只读属性‘name’;

  不可枚举

  通过设置 enumerable 标志可以设置属性是否可以枚举 

  

 let user = {
name: "John",
toString() {
return this.name;
}
}; // 默认情况下,我们的两个属性都会列出:
for (let key in user) alert(key); // name, toString Object.defineProperty(user, "toString", {
enumerable: false
}); // 现在 toString 消失了:
for (let key in user) alert(key); // name

  不可配置

  通过设置configurable 标志,来控制属性是否可以修改

  

 let user = { };

 Object.defineProperty(user, "name", {
value: "John",
writable: false,
configurable: false
}); // 不能修改 user.name 或 它的标志
// 下面的所有操作都不起作用:
// user.name = "Pete"
// delete user.name
// defineProperty(user, "name", ...)
Object.defineProperty(user, "name", {writable: true}); // 错误

  Object.defineProperties

  一次定义多个属性,语法和示例如下:

 Object.defineProperties(obj, {
prop1: descriptor1,
prop2: descriptor2
// ...
});
Object.defineProperties(user, {
name: { value: "John", writable: false },
surname: { value: "Smith", writable: false },
// ...
});

  Object.getOwnPropertyDescriptors(obj)

  一次获取所有属性描述

  语法:let clone = Object.defineProperties({}, Object.getOwnPropertyDescriptors(obj));

2、属性的getter 和 setter

  getter 和 setter  

 let obj = {
get propName() {
// getter, the code executed on getting obj.propName
}, set propName(value) {
// setter, the code executed on setting obj.propName = value
}
};

  访问器描述符 

  • get —— 一个没有参数的函数,在读取属性时工作,
  • set —— 带有一个参数的函数,当属性被设置时调用,
  • enumerable —— 与数据属性相同,
  • configurable —— 与数据属性相同。

  兼容性

 function User(name, birthday) {
this.name = name;
this.birthday = birthday; // age 是由当前日期和生日计算出来的
Object.defineProperty(this, "age", {
get() {
let todayYear = new Date().getFullYear();
return todayYear - this.birthday.getFullYear();
}
});
} let john = new User("John", new Date(, , )); alert( john.birthday ); // birthday 是可访问的
alert( john.age ); // ...age 也是可访问的

这个例子主要解决了,当存储表示一个可以互相转换的值。

3、原型继承

  Prototype

  Prototype 是内部隐藏的,但是可以通过_proto_设置

  let animal = {

    eats:true

  };

  let rabbit = {

    jumps:true

  };

  rabbit._proto_=animal;

  alert(rabbit.eats);

  alert(rabbit.jumps);

4、函数原型

  • F.prototype 属性与 [[Prototype]] 不同。F.prototype 唯一的作用是:当 new F() 被调用时,它设置新对象的 [[Prototype]]
  • F.prototype 的值应该是一个对象或 null:其他值将不起作用。
  • "prototype" 属性在设置为构造函数时仅具有这种特殊效果,并且用 new 调用。
     let animal = {
    eats: true
    }; function Rabbit(name) {
    this.name = name;
    } Rabbit.prototype = animal; let rabbit = new Rabbit("White Rabbit"); // rabbit.__proto__ == animal alert( rabbit.eats ); // true

5、原生的原型

  • 所有的内置对象都遵循一样的模式:

    • 方法都存储在原型对象上(Array.prototypeObject.prototypeDate.prototype 等)。
    • 对象本身只存储数据(数组元素、对象属性、日期)。
  • 基本数据类型同样在包装对象的原型上存储方法:Number.prototypeString.prototypeBoolean.prototype。只有 undefinednull 没有包装对象。
  • 内置对象的原型可以被修改或者被新的方法填充。但是这样做是不被推荐的。只有当添加一个还没有被 JavaScript 引擎支持的新方法的时候才可能允许这样做。

6、原型方法

  • Object.create(proto[, descriptors]) —— 利用给定的 proto 作为 [[Prototype]] 来创建一个空对象。
  • Object.getPrototypeOf(obj) —— 返回 obj[[Prototype]](和 __proto__ getter 相同)。
  • Object.setPrototypeOf(obj, proto) —— 将 obj[[Prototype]] 设置为 proto(和 __proto__ setter 相同)。
  • Object.keys(obj) / Object.values(obj) / Object.entries(obj) —— 返回包含自身属性的名称/值/键值对的数组。
  • Object.getOwnPropertySymbols(obj) —— 返回包含所有自身 symbol 属性名称的数组。
  • Object.getOwnPropertyNames(obj) —— 返回包含所有自身字符串属性名称的数组。
  • Reflect.ownKeys(obj) —— 返回包含所有自身属性名称的数组。
  • obj.hasOwnProperty(key):如果 obj 拥有名为 key 的自身属性(非继承得来),返回 true

  同时我们还明确了 __proto__[[Prototype]] 的 getter/setter,位置在 Object.prototype,和其他方法相同。

  我们可以不借助 prototype 创建一个对象,那就是 Object.create(null)。这些对象被用作是「纯字典」,对于它们而言 "__proto__" 作为键没有问题。

  所有返回对象属性的方法(如 Object.keys 以及其他)—— 都返回「自身」属性。如果我们想继承它们,我们可以使用 for...in

javaScript 基础知识汇总 (十二)的更多相关文章

  1. javaScript 基础知识汇总(二)

    1.运算符 术语或者叫法:一元运算符.二元运算符.运算元(参数) let x=0; x=5+2; //5和2为运算元,“+” 为二元运算符: x=-x; //"-" 为一元运算符 ...

  2. JavaScript 基础知识汇总目录

    一.标签.代码结构.现代模式.变量.数据类型.类型转换 GO 二.运算符.值的比较.交互.条件运算符.逻辑运算符 GO 三.循环 while 和 for .switch语句.函数.函数表达式和箭头函数 ...

  3. javaScript 基础知识汇总 (十)

    1.New Function 语法:let func = new Function ([arg1[, arg2[, ...argN]],] functionBody) //无参数示例: let say ...

  4. javaScript 基础知识汇总 (十五)

    1.模块简介 什么是模块: 模块就是一个文件,一个脚本,通过关键字export 和 import 交换模块之间的功能. export 关键字表示在当前模块之外可以访问的变量和功能. import 关键 ...

  5. javaScript 基础知识汇总 (十四)

    1.回调 什么是回调? 个人理解,让函数有序的执行. 示例: function loadScript(src,callback){ let script = document.createElemen ...

  6. 基础知识《十二》一篇文章理解Cookie和Session

    理解Cookie和Session机制 会话(Session)跟踪是Web程序中常用的技术,用来跟踪用户的整个会话.常用的会话跟踪技术是Cookie与Session.Cookie通过在客户端记录信息确定 ...

  7. JavaScript基础知识总结(二)

    JavaScript语法 二.数据类型 程序把这些量.值分为几大类,每一类分别叫什么名称,有什么特点,就叫数据类型. 1.字符串(string) 字符串由零个或多个字符构成,字符包括字母,数字,标点符 ...

  8. JavaScript基础知识汇总

    1. 图片热区: <img src="logo.jpg" usemap="#logo"> <map id="logo" n ...

  9. javascript基础学习(十二)

    javascript之BOM 学习要点: 屏幕对象 History对象 Location对象 一.屏幕对象 Screen对象是一个由javascript自动创建的对象,该对象的主要作用是描述客户端的显 ...

随机推荐

  1. .js——alert()语句

    在.js文件中,通过alert()语句可以生成弹出框,弹出框中的内容message部分可以是常量字符串,也可以是含有变量的字符串连接,下面举几个例子简要说明下: 1. 参数为常量字符串 alert(& ...

  2. java 项目乱码解决(web.xml全局配置编码格式)

    <!-- 乱码解决 --> <filter> <filter-name>encodingFilter</filter-name> //过滤器名称 < ...

  3. H5本地离线存储

    前言上一篇文件结尾,有同学问我本地存储图片方法,其实本地存储方式有很多,我们打开谷歌浏览器,查看源代码,在resources页签中,有web SQl ,indexedDB等等,我前面文章讲过Local ...

  4. windows的各种扩展名详解

    Windows系统文件按照不同的格式和用途分很多种类,为便于管理和识别,在对文件命名时,是以扩展名加以区分的,即文件名格式为: 主文件名.扩展名.这样就可以根据文件的扩展名,判定文件的种类,从而知道其 ...

  5. OutputStream之flush() · 李大白写点儿啥

    最近在做一个网络下载功能,I/O操作时,操作完OutputStream时写了flush(),目的是刷新输出流,将缓存写入物理设备.突然就想,这里是否需要flush()呢? 我当时的代码: 1 2 3 ...

  6. Welcome to Erhan Blog

    "Yeah It's on. " 前言 Erhan 的 Blog 就这么开通了. 跳过废话,直接看技术实现 2018 年,Hux 总算有个地方可以好好写点东西了. 作为一个程序员, ...

  7. HTML笔记02

    网页中的颜色有三种表示方法 颜色单词:blue.green.red.yellow 10进制表示:rgb(255,0,0).rgb(0,255,0).rgb(0,0,255) 16进制表示:#ff000 ...

  8. PostgreSQL没有认证密码就登陆了缘由

    上午同事爆出这样的问题,使用正确的用户名和错误的密码连接了postgresql数据库,竟然连上了.这不是故意这样神操作,不小心密码写错了,咋一看这样怎么能行,随便输入一个密码都能登陆上.自己测试也是同 ...

  9. springboot创建,自动装配原理分析,run方法启动

    使用IDEA快速创建一个springboot项目 创建Spring Initializr,然后一直下一步下一步直至完成 选择web,表示创建web项目 运行原理分析 我们先来看看pom.xml文件 核 ...

  10. iview 和 Elemet UI 源码比较

    (近期给自己立了个小flag,读源码,每周至少读1篇源码) 下面来谈谈iview 和 Elemet UI 这两个基于Vue 的UI 框架源码的基本结构以及区别. 一.文件结构开发主要放在根文件夹下的s ...