js权威指南学习笔记(四)对象
1、创建对象
var empty = {}; //创建一个空对象
var point = {
x : 0,
y : "ccc
}
var o = new Object(); //创建一个空对象
var o = Object.create({ x: 1, y: 2}); //o继承了属性x和y
var o2 = Object.create(Object.prototype); //创建一个空对象
//这里使用es5 的Object.create()函数来创建对象
var o = {r: 1}; //一个用来继承的对象
var c = Object.create(o); //创建一个新对象c,c继承o对象属性r
c.x = 1; c.y = 2; //c定义两个属性
c.r = 2; //c覆盖继承来的属性
console.log(o.r); //1 原型对象没有修改
- o中的属性p是只读的:不能给只读属性重新赋值(defineProperty()方法中有一个例外,可以对可配置的只读属性重新赋值)。
- o中的属性p是继承属性,且它是只读的:不能通过同名自有属性覆盖只读的继承属性。
- o中不存在自有属性p:o没有使用setter方法继承属性p,并且o的可扩展性是false。如果o中不存在p,而且没有setter方法可供调用,则p一定会添加至o中。但如果o不是可扩展的,那么在o中不能定义新属性。
3、删除属性
o = {x:1};
delete o.x; //true
delete o.x; //什么也没做(x已经不存在),返回true
delete o.toString; //什么也没做(toString是继承来的) ,返回true
delete 1; //无意义,返回true
delete Object.prototype; //不能删除,属性是不可配置的
var o = { x:1 };
"x" in o; //true "x"是o的属性
"y" in o; //false "y"不是o的属性
"toString" in o; //true o继承toString属性
var o = { x:1 };
o.hasOwnProperty("x"); //true o有一个自有属性x
o.hasOwnProperty("y"); //false o中不存在属性y
o.hasOwnProperty("toString"); //false toString是继承属性
var o = Object.create({ y: 2});
o.x = 1;
o.propertyIsEnumerable("x"); // true: o有一个可枚举的自有属性x
o.propertyIsEnumerable("y"); //false y是继承来的
Object.prototype.propertyIsEnumerable("toString"); //false 不可枚举
var o = { x:1 };
o.x !== undefined; //true o中有属性x
o.y !== undefined; //false o中没有属性y
o.toString !== undefined; //true o继承了toString属性
o.z = undefined;
o.z !== undefined; //false 属性存在,但值为undefined
delete o.z; //删除属性
"z" in o; //false,属性不存在
var o = {
data_prop: value, //普通的数据属性
//存取器属性
get accessor_prop() { /*函数体 */ },
set accessor_prop() { /*函数体 */ }
};
//笛卡尔点坐标对象
var p = {
x: 1.0,
y: 1.0,
get r() {
return Math.sqrt(this.x * this.x + this.y * this.y); //this指代这个点的对象,即p
},
set r(newvalue) {
var oldvalue = Math.sqrt(this.x * this.x + this.y * this.y);
var ratio = newvalue / oldvalue;
this.x *= ratio;
this.y *= ratio;
},
get theta() {
return Math.atan2(this.y, this.x);
}
};
var q = Object.create(p); //创建一个继承getter和setter的新对象
q.x = 2, q.y = 1; //给q添加两个属性
console.log(q.r); //可以使用继承的存取器属性
console.log(q.theta);
console.log(Object.getOwnPropertyDescriptor({
x: 1
}, "x")); //返回 {value:1, writable:true, enumerable:true, configurable:true}
var random = {
get octet() {
return Math.floor(Math.random() * 256);
},
}
//查询定义的random对象的octet属性
console.log(Object.getOwnPropertyDescriptor(random, "octet"));
//返回 {get: /*function函数*/, set:undefined, enumerable:true, configurable:true}
//对于继承属性和不存在的属性,返回undefined
console.log(Object.getOwnPropertyDescriptor({}, "x")); //undefined
console.log(Object.getOwnPropertyDescriptor({}, "toString")); //undefined
var o = {}; //创建一个空对象
//添加一个不可枚举的数据属性x,并赋值为1
Object.defineProperty(o, "x", {
value: 1,
writable: true,
enumerable: false,
configurable: true
});
console.log(o.x); //1
console.log(Object.keys(o)); //返回[] keys方法,返回所有可枚举的属性
//对属性x进行修改,让它变为只读
Object.defineProperty(o, "x", {
writable: false
});
o.x = 2; //更改属性值
console.log(o.x); //1 没有被更改,属性是只读
//属性是可配置的,因此可以通过这种方式对它进行修改
Object.defineProperty(o, "x", {
value: 2
});
console.log(o.x); // 2
//将x从数据属性修改为存取器属性
Object.defineProperty(o, "x", {
get: function() {
return 0;
}
});
console.log(o.x); // 0
console.log(Object.getOwnPropertyDescriptor(o, "x")); //查看x的特性
//首先创建一个空对象,然后给它添加两个数据属性和一个只读存取器属性。
var p = Object.defineProperties({}, {
x: {
value: 1,
writable: true,
enumerable: true,
configurable: true
},
y: {
value: 1,
writable: true,
enumerable: true,
configurable: true
},
r: {
get: function() {
return Math.sqrt(this.x * this.x + this.y * this.y)
},
enumerable: true,
configurable: true
}
});
- 如果对象是不可扩展的,则可以编辑已有的自有属性,但不能给它添加新属性。
- 如果属性是不可配置的,则不能修改它的可配置性和可枚举性。
- 如果存取器属性是不可配置的,则不能修改其getter和setter方法,也不能将它转换为数据属性。
- 如果数据属性是不可配置的,则不能将它转换为存取器属性。
- 如果数据属性是不可配置的,则不能将它的可写性从false修改为true,但可以从true修改为false。
- 如果数据属性是不可配置且不可写的,则不能修改它的值。然而可配置但不可写属性的值是可以修改的(实际上是先将它标记为可写,然后修改它的值,最后转换为不可写的)。
例子:复制属性的特性
/*
*给Object.prototype添加一个不可枚举的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]); //获取o中的属性描述符
Object.defineProperty(this, names[i], desc); //用它给当前对象(this)创建一个属性
}
}
});
function People() {} //空的构造函数
People.prototype = { //设置原型属性
constructor: People,
name: "cart",
}
var cc = new People(); //实例化构造函数,创建一个新的对象
console.log(Object.getPrototypeOf(cc));
//定义一个原型对象
var p = {
x: 1
};
var o = Object.create(p); //使用原型对象创建一个对象
console.log(p.isPrototypeOf(o)); // true
console.log(Object.prototype.isPrototypeOf(o)); //true o继承p,p继承Object.prototype
// 定义一个获取对象类属性的函数
function classof(o) {
if (o === null) {
return "Null";
}
if (o === undefined) {
return "Undefined";
}
return Object.prototype.toString.call(o).slice(8, -1); //间接调用toString方法返回类属性
}
classof(1); // NUmber
function f() {}; //定于一个自定义构造函数
classof(new f()); // Object
- 对象的可扩展性用以表示是否可以给对象添加新属性。可以通过将对象传入Object.isExtensible(),来判断该对象是否是可扩展的。
- 如果想将对象转换为不可扩展的,需要调用Object.preventExtensions(),将待转换的对象作为参数传进去。
var o = {
x: 1,
y: {
z: [false, null, ""]
}
};
console.log(Object.isExtensible(o)); //true
Object.preventExtensions(o); //将对象转换为不可扩展
console.log(Object.isExtensible(o)); //false
- Object.seal(Object);它除了可以设置对象的不可扩展,还可以设置对象的自有属性都设置为不可配置的,不能删除和配置。对于它已经有的可写属性依然可以设置。
- Object.isSealed(Object); 检查对象是否封闭。
- Object.freeze();更严格的锁定对象(冻结)。除了将对象设置为不可扩展,属性设置为不可配置,所有的自有属性设置为只读的,(如果对象存储器属性有setter方法,存储器属性不受影响,依然可以通过属性赋值给他们)。
- Object.isFrozen() 来检测对象是否冻结。
// 定义一个测试对象
var o = {
x: 1,
y: {
z: [false, null, ""]
}
};
var s = JSON.stringify(o);
var p = JSON.parse(s);
console.log(s); //解析为json格式字符串 {"x":1,"y":{"z":[false,null,""]}}
console.log(p); //将字符串转换为javascript对象
span::selection, .CodeMirror-line > span > span::selection { background: #d7d4f0; }.CodeMirror-line::-moz-selection, .CodeMirror-line > span::-moz-selection, .CodeMirror-line > span > span::-moz-selection { background: #d7d4f0; }.cm-searching {background: #ffa; background: rgba(255, 255, 0, .4);}.cm-force-border { padding-right: .1px; }@media print { .CodeMirror div.CodeMirror-cursors {visibility: hidden;}}.cm-tab-wrap-hack:after { content: ""; }span.CodeMirror-selectedtext { background: none; }.CodeMirror-activeline-background, .CodeMirror-selected {transition: visibility 0ms 100ms;}.CodeMirror-blur .CodeMirror-activeline-background, .CodeMirror-blur .CodeMirror-selected {visibility:hidden;}.CodeMirror-blur .CodeMirror-matchingbracket {color:inherit !important;outline:none !important;text-decoration:none !important;}.CodeMirror-sizer {min-height:auto !important;}
-->
li {list-style-type:decimal;}.wiz-editor-body ol.wiz-list-level2 > li {list-style-type:lower-latin;}.wiz-editor-body ol.wiz-list-level3 > li {list-style-type:lower-roman;}.wiz-editor-body blockquote {padding: 0 12px;}.wiz-editor-body blockquote > :first-child {margin-top:0;}.wiz-editor-body blockquote > :last-child {margin-bottom:0;}.wiz-editor-body img {border:0;max-width:100%;height:auto !important;margin:2px 0;}.wiz-editor-body table {border-collapse:collapse;border:1px solid #bbbbbb;}.wiz-editor-body td,.wiz-editor-body th {padding:4px 8px;border-collapse:collapse;border:1px solid #bbbbbb;min-height:28px;word-break:break-word;box-sizing: border-box;}.wiz-hide {display:none !important;}
-->
js权威指南学习笔记(四)对象的更多相关文章
- js权威指南---学习笔记02
1.JS只有函数作用域,没有块级作用域这个概念: 它有一个特性——声明提前:在同一个函数中不同位置声明的变量,都被提前在函数开始的时候,执行声明操作:在原先位置执行赋值操作: 2.声明的全局变量,相当 ...
- js权威指南学习笔记(一)类型、值和变量
1.数据类型:原始类型(primitive type) 和对象类型(object type) 原始类型包括数字.字符串和布尔值: 除数字.字符串.布尔值.null(空).undefined(未定义), ...
- js权威指南---学习笔记01
1.当函数赋值给对象的属性时,就变为了方法:2.被零整除不报错,只会返回无穷大(Infinity)或者负无穷大.例外:零除以零等于非数字(NaN).3.NaN与任何值都不相等! 4.Javascrip ...
- js权威指南学习笔记(三)语句
1.声明语句 如果用var声明的变量没有初始化,那么这个变量的值会被初始化为undefined. 函数声明语句的语法如下: 4 4 1 console.log(func ...
- js权威指南学习笔记(二)表达式与运算符
1.数组初始化表达式 数组直接量中的列表逗号之间的元素可以省略,这时省略的空位会填充undefined.如: 2 2 1 var arr = [1,,,,,6]; 2 ...
- netty权威指南学习笔记四——TCP粘包/拆包之粘包问题解决
发生了粘包,我们需要将其清晰的进行拆包处理,这里采用LineBasedFrameDecoder来解决 LineBasedFrameDecoder的工作原理是它依次遍历ByteBuf中的可读字节,判断看 ...
- IDA Pro 权威指南学习笔记(四) - IDA 用户界面的基本规则
基本规则: IDA 不提供撤销功能 如果由于不小心按下某个键,导致数据库文件发生意外,这时需要将显示窗口恢复到以前的状态 几乎所有的操作都有其对应的菜单项.热键和工具栏按钮 IDA 的工具栏高度可配置 ...
- JavaScript 权威指南-学习笔记(一)
本文所有教程及源码.软件仅为技术研究.不涉及计算机信息系统功能的删除.修改.增加.干扰,更不会影响计算机信息系统的正常运行.不得将代码用于非法用途,如侵立删! ## JavaScript 权威指南-学 ...
- HTTP权威指南-学习笔记
目录 HTTP权威指南-学习笔记 HTTP: Web的基础 URL与资源 HTTP报文 连接管理 HTTP结构 Web服务器 代理 缓存 集成点: 网关,隧道及中继 Web机器人 识别,认证与安全 客 ...
随机推荐
- 2016级算法第三次上机-E.ModricWang's Polygons
930 ModricWang's Polygons 思路 首先要想明白,哪些多边形可能是格点正多边形? 分情况考虑: 三角形不可能,因为边长为有理数的正三角形的面积为无理数,而格点三角形的面积为有理数 ...
- 数据库开发基础-★SQl Server 控制数据库的服务+数据库的创建与管理(增删改查)★
控制数据库的服务: 方法一: 1.Windows+R 打开运行 打开cmd 2.输入net start MSSQLserver 启动数据库服务 输入net stop MSSQLserver 关闭数据 ...
- 干掉Vivado幺蛾子(1)-- Xilinx Tcl Store
目录 1. 安装Xilinx Tcl Store 2. 手动更新 2.1 下载库 2.2 修改环境变量 参考文献: 最近在跟着高亚军老师的分析文章来学习Xilinx最近发布的<UltraFast ...
- origin显示三维曲面
准备数据并选中数据: 这里如果只关心z<1部分的趋势,可以对Z轴范围进行调整,双击Z轴的数字: 然后修改显色条的范围,双击曲面: 最后让曲面最上面部分clip掉: 成功了:
- 扩展中国剩余定理 exCRT 学习笔记
前言 由于 \(\{\mathrm{CRT}\}\subseteq\{\mathrm{exCRT}\}\),而且 CRT 又太抽象了,所以直接学 exCRT 了. 摘自 huyufeifei 博客 这 ...
- scrapy parse()方法工作机制(转)
1.因为使用的yield,而不是return.parse函数将会被当做一个生成器使用.scrapy会逐一获取parse方法中生成的结果,并判断该结果是一个什么样的类型: 2.如果是request则加入 ...
- vscode用yuml画类图
vscode用yuml画类图 最近在找画类图的工具,发现vscode一款插件很好用,还支持markdown.vscode插件中直接搜索yuml安装即可. 文件后缀.yuml. 文件开头第一行这样写// ...
- jQuery懒加载插件 – jquery.lazyload.js
Lazy Load 是一个用 JavaScript 编写的 jQuery 插件. 它可以延迟加载长页面中的图片. 在浏览器可视区域外的图片不会被载入, 直到用户将页面滚动到它们所在的位置. 这与图片预 ...
- CSAPP阅读笔记-栈帧-来自第三章3.7的笔记-P164-P176
1.基本结构: 如上图所示,是通用的栈帧结构.大致分两块,调用者函数P和被调用者函数Q. 对P来说,要做的工作是把传递参数中多于6个的部分压栈,随后把Q返回时要执行的下一条指令的地址压栈. 对Q来说, ...
- input获得焦点时改变placeholder文本的样式
HTML: <input type="text" placeholder="sample text"/> CSS: input::-webkit-i ...