javaScript 基础知识汇总 (十二)
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.prototype、Object.prototype、Date.prototype等)。 - 对象本身只存储数据(数组元素、对象属性、日期)。
- 方法都存储在原型对象上(
- 基本数据类型同样在包装对象的原型上存储方法:
Number.prototype、String.prototype和Boolean.prototype。只有undefined和null没有包装对象。 - 内置对象的原型可以被修改或者被新的方法填充。但是这样做是不被推荐的。只有当添加一个还没有被 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 基础知识汇总 (十二)的更多相关文章
- javaScript 基础知识汇总(二)
1.运算符 术语或者叫法:一元运算符.二元运算符.运算元(参数) let x=0; x=5+2; //5和2为运算元,“+” 为二元运算符: x=-x; //"-" 为一元运算符 ...
- JavaScript 基础知识汇总目录
一.标签.代码结构.现代模式.变量.数据类型.类型转换 GO 二.运算符.值的比较.交互.条件运算符.逻辑运算符 GO 三.循环 while 和 for .switch语句.函数.函数表达式和箭头函数 ...
- javaScript 基础知识汇总 (十)
1.New Function 语法:let func = new Function ([arg1[, arg2[, ...argN]],] functionBody) //无参数示例: let say ...
- javaScript 基础知识汇总 (十五)
1.模块简介 什么是模块: 模块就是一个文件,一个脚本,通过关键字export 和 import 交换模块之间的功能. export 关键字表示在当前模块之外可以访问的变量和功能. import 关键 ...
- javaScript 基础知识汇总 (十四)
1.回调 什么是回调? 个人理解,让函数有序的执行. 示例: function loadScript(src,callback){ let script = document.createElemen ...
- 基础知识《十二》一篇文章理解Cookie和Session
理解Cookie和Session机制 会话(Session)跟踪是Web程序中常用的技术,用来跟踪用户的整个会话.常用的会话跟踪技术是Cookie与Session.Cookie通过在客户端记录信息确定 ...
- JavaScript基础知识总结(二)
JavaScript语法 二.数据类型 程序把这些量.值分为几大类,每一类分别叫什么名称,有什么特点,就叫数据类型. 1.字符串(string) 字符串由零个或多个字符构成,字符包括字母,数字,标点符 ...
- JavaScript基础知识汇总
1. 图片热区: <img src="logo.jpg" usemap="#logo"> <map id="logo" n ...
- javascript基础学习(十二)
javascript之BOM 学习要点: 屏幕对象 History对象 Location对象 一.屏幕对象 Screen对象是一个由javascript自动创建的对象,该对象的主要作用是描述客户端的显 ...
随机推荐
- c socket 开发测试
c语言异常 参照他人代码写一个tcp的 socket 开发测试 异常A,在mac osx系统下编译失败,缺库转到debian下. 异常B,include引用文件顺序不对,编译大遍异常 异常C,/usr ...
- 设置Fiddler来抓取Android接口数据
1.下载安装fiddler,安装包可自行百度.安装完成打开fiddler 2.将Fiddler设置远程访问PC 选择Fiddler->Tools->Fiddler Option 3.选择C ...
- [Python] Advanced features
Slicing 12345 L[:10:2] # [0, 2, 4, 6, 8]L[::5] # 所有数,每5个取一个# [0, 5, 10, 15, 20, 25, 30, 35, 40, 45, ...
- CPU|MICGPU|FPGA|超算|Meta-data|
生物医学大数据: 收集数据后对数据的分析,如同看相,而对数据信息的挖掘可以看作是算命.这两个过程是基于算法和软件这类工具之上的. 在存储方面:在硬件上,为了Parallel computing的目的, ...
- JDBC连接到数据库查询打印数据
通过一天的视频学习,认识了jdbc的连接原理前来小结: 游标读取数据库表的行一次读取一个,getXxx()方法读取表的列一个数据 next()方法可以让游标下移 可以把数据库的表看做是一个类,每条记录 ...
- Mongdb创建 连接过程
在bin目录下启动后 Show dbs 显示库,库里有内容才会显示库名称 Use admin 切换库 没有的默认创建 show users显示用户信息 Show collections显示表名 db. ...
- 理解 Java 内存模型的因果性约束
目录 理解 Java 内存模型的因果性约束 欢迎讨论 规范理解 例子练习 例子1 例子2 总结 理解 Java 内存模型的因果性约束 欢迎讨论 欢迎加入技术交流群186233599讨论交流,也欢迎关注 ...
- C++走向远洋——39(指向学生类的指针)
*/ * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:zhizhen.cpp * 作者:常轩 * 微信公众号:Worl ...
- idea通过maven打jar包不成功或无法加载主类或打成功也找不到jar包
这个问题纠结了我一天,在网上也搜了一些方法,现在把我自己的处理过程记录一下,以方便遇到此类问题的小伙伴参考: 第一步:查看idea的jdk版本与Windows安装的jdk是不是同一个版本,如下图 第二 ...
- BLAKE及BLAKE2算法详解
1 简介 哈希算法 (Hash Algorithm) 是将任意长度的数据映射为固定长度数据的算法,也称为消息摘要.一般情况下,哈希算法有两个特点: 原始数据的细微变化(比如一个位翻转)会导致结果产生巨 ...