09 Object
Object
在看 ES6 Object的时候,我发觉ES5 Object 的更新我并不是完全知道。
于是觉得还是看一下.
1. __proto__
作为一个 半吊子前端开发人员. 居然不知道这个..
首先这个 MSDN 上的例子
function Rectangle() {
}
var rec = new Rectangle();
if (console && console.log) {
console.log(rec.__proto__ === Rectangle.prototype); // Returns true
rec.__proto__ = Object.prototype;
console.log(rec.__proto__ === Rectangle.prototype); // Returns false
}
然后我发现。 貌似这个就是原型链。
只不过以前是隐藏的现在将他公布出来。
他指向构造函数的 prototype
.
例如这样
function a() { };
a.prototype.haha = 10;
a.prototype.haha1 = 11;
var a1 = new a();
h.w(a1.__proto__);
//constructor:a()
//haha:10
//haha1:11
//haha2:20
a1.__proto__.haha2 = 20;
h.w(a1.haha);
h.w(a1.haha1);
h.w(a1.haha2);
h.w(a1.__proto__);
//constructor:a()
//haha:10
//haha1:11
//haha2:20
这边其实是有些疑问的.
比如 haha
& haha1
是并不存在于 a1.__proto__
中.
理论上是 在 a1.__proto__
中找不到 向上层 prototype
中寻找
但是输出的时候却看得见。
还有就是
在第一次执行 h.w(a1.__proto__);
的时候
确输出了 haha2
. 这个应该是在第二次执行的输出的时候才有的啊。
于是在加了一段代码.
function a() { };
a.prototype.haha = 10;
a.prototype.haha1 = 11;
var a1 = new a();
h.w(a1.__proto__);
h.w(a1.haha2); //undefined.
a1.__proto__.haha2 = 20;
h.w(a1.haha);
h.w(a1.haha1);
h.w(a1.haha2);
h.w(a1.__proto__);
所以我不知道 chrome 在搞什么...
但是能确定的是 __proto__
就是原型链。
所以.
var o = {}; // o = new Object()
o.__proto__ === Object.prototype
2. Object.assign
var target = { a: 1 };
var source1 = { b: 2 };
var source2 = { c: 3 };
Object.assign(target, source1, source2);
target // {a:1, b:2, c:3}
简单说就是合并。
如果有相同的值以后面为准
首先需要注意的是,复制的问题。
多层嵌套以后,他是直接复制的.
var target4 = {a: 1};
var target5 = Object.assign({}, target4);
target5.a = 2;
h.w(target4); //1
var target = { a: 1,b:{ b1:1 } };
var target1 = Object.assign({},target);
target1.a = 2;
target1.b.b1 = 2;
h.w(target.a); //1
h.w(target.b.b1); //2
所以如果你想复制一个 Object
var target = { a: 1,b:{ b1:1 } };
var target1 = Object.assign({},target);
有多层嵌套的肯定不行。
assign
一些特殊的传入值
try{
Object.assign(undefined);
Object.assign(null);
}
catch(ex) {
h.w(ex.name + ":" + ex.message)
//TypeError:Cannot convert undefined or null to object
}
h.w(Object.assign(2)); //Number {[[PrimitiveValue]]: 2}
h.w(Object.assign("haha")); //String {0: "h", 1: "a", 2: "h", 3: "a", length: 4, [[PrimitiveValue]]: "haha"}
h.w(Object.assign({a:1})); //Object {a: 1}
h.w(Object.assign({},true)); //Object {}
h.w(Object.assign({},"aaa","bbb")); //Object {0: "b", 1: "b", 2: "b"}
h.w(Object.assign({},10)); //Object {}
3 Object.create
var o = Object.create({a:1}, {
size: {
value: "large",
enumerable: true
},
shape: {
value: "round",
enumerable: true
}
});
h.w(o.a);
h.w(o.size);
h.w(o.shape);
这个是微软的例子
在我的理解已经很说明问题了。
第一个参数 就是原型链继承。
function a() {}
a.prototype = 第一个参数
return new a()
第二个参数我感觉像是 this
不过我不能100%确定..
4. defineProperty & defineProperties
Object.defineProperty(object, propertyname, descriptor)
object
必需。 要在其上添加或修改属性的对象。 这可能是一个本机 JavaScript 对象(即用户定义的对象或内置对象)或 DOM 对象。
propertyname
必需。 一个包含属性名称的字符串。
descriptor
必需。 属性描述符。 它可以针对数据属性或访问器属性。
// Create a user-defined object.
var obj = {};
// Add a data property to the object.
Object.defineProperty(obj, "newDataProperty", {
value: 101,
writable: true,
enumerable: true,
configurable: true
});
// Set the property value.
obj.newDataProperty = 102;
document.write("Property value: " + obj.newDataProperty + newLine);
value 默认值
writable 是否可写
enumerable 可枚举
configurable 是否可删除
set 写的接口
get 读的接口
大概就这些。
但是里面还是有不少东西值得注意
var obj = {};
// Add a data property to the object.
Object.defineProperty(obj, "newDataProperty", {
value: 101
});
obj.newDataProperty = 100;
h.w(obj.newDataProperty); //101
比如加上 value
这个默认值, 似乎就会加上 writable = false
修改不了,除非你显示声明了 writable = true
configurable
也就是说 delete obj.newDataProperty
不会再有效了。
enumerable
.
var obj1 = { a:1 };
// Add a data property to the object.
Object.defineProperty(obj1, "newDataProperty", {
value: 101,
enumerable:false
});
for(var key in obj1)
h.w(key);
set,get
这个比较简单。 就是提供了一个方法而已.
Object.defineProperty(obj, "newAccessorProperty", {
set: function (x) {
document.write("in property set accessor" + newLine);
this.newaccpropvalue = x;
},
get: function () {
document.write("in property get accessor" + newLine);
return this.newaccpropvalue;
},
enumerable: true,
configurable: true
});
最后 defineProperties
就是多一层 嵌套。 可以一次写多个。
var obj = {};
Object.defineProperties(obj, {
newDataProperty: {
value: 101,
writable: true,
enumerable: true,
configurable: true
},
newAccessorProperty: {
set: function (x) {
document.write("in property set accessor" + newLine);
this.newaccpropvalue = x;
},
get: function () {
document.write("in property get accessor" + newLine);
return this.newaccpropvalue;
},
enumerable: true,
configurable: true
}});
也可以生成好以后 传进去
var obj = {};
var descriptors = { xxx : {value:1 }};
Object.defineProperties(obj, descriptors)
5. Object.freeze(object)
冻结。
其实也就是通过 defineProperty
将除了 enumerable
所有属性设置为false.
6.getOwnPropertyDescriptor && getOwnPropertyDescriptors
var o = { a:1 };
var keys = Object.getOwnPropertyDescriptor(o,"a");
h.w(keys);
configurable:true
enumerable:true
value:1
writable:true
Object.freeze(o);
var keys1 = Object.getOwnPropertyDescriptor(o,"a");
h.w(keys1);
configurable:false
enumerable:true
value:1
writable:false
其实就是返回某一个字段 属性。
然后你可以修改了以后 再赋给 字段...
所以说。 给 object 增加了 属性 也不是绝对的安全啊 哈哈哈
getOwnPropertyDescriptors
是ES7的提案。
可以一次返回所有 不用一个一个字段来弄.
7. getOwnPropertyNames
function Pasta(grain, width, shape) {
// Define properties.
this.grain = grain;
this.width = width;
this.shape = shape;
this.toString = function () {
return (this.grain + ", " + this.width + ", " + this.shape);
}
}
Pasta.prototype.test = "haha";
// Create an object.
var spaghetti = new Pasta("wheat", 0.2, "circle");
// Get the own property names.
var arr = Object.getOwnPropertyNames(spaghetti);
document.write (arr);
// Output:
// grain,width,shape,toString
上面这个是微软的例子。 就是遍历 属性
很简单,但是他很好玩的是
var o = { a:1 }
Object.defineProperty(o,'haha',{
enumerable:false,
value:2
});
var arr1 = Object.getOwnPropertyNames(o);
h.w(arr1);
他无视了 enumerable
8. getPrototypeOf 获取原型链
var a = function() {}
h.w(a.prototype == Object.getPrototypeOf(a)); //false
var b = new a();
h.w(b.__proto__ == Object.getPrototypeOf(b)) //true
9. Object.is
主要是用来规避
h.w(+0 === -0); //true
h.w(NaN === NaN); //false
h.w(Object.is(+0,-0)); //false
h.w(Object.is(NaN,NaN)); //true
其他一样
10. isExtensible isSealed isFrozen
https://msdn.microsoft.com/zh-cn/library/ff806189(v=vs.94).aspx
https://msdn.microsoft.com/zh-cn/library/ff806185(v=vs.94).aspx
https://msdn.microsoft.com/zh-cn/library/ff806188(v=vs.94).aspx
这三个真的木有什么好讲的..
Object.preventExtensions 设置不可扩展
Object.seal 设置是否 configurable
标题三个 就是来检测是否设置了。
11.Object.Keys
感觉和 getOwnPropertyNames
一模一样.
只不过
var o = { a:1 }
Object.defineProperty(o,'haha',{
enumerable:false,
value:2
});
h.w(Object.keys(o))
enumerable 有用了
资料
09 Object的更多相关文章
- Java多线程系列 基础篇09 Object.wait/notifyJVM源码实现
转载 https://www.jianshu.com/p/f4454164c017 作者 占小狼 最简单的东西,往往包含了最复杂的实现,因为需要为上层的存在提供一个稳定的基础,Object作为java ...
- js中类型识别的方法
第一种方法typeof typeof是一种运算符,它的值有以下几种 <!DOCTYPE html> <html lang="en"> <head> ...
- ES6入门笔记
ES6入门笔记 02 Let&Const.md 增加了块级作用域. 常量 避免了变量提升 03 变量的解构赋值.md var [a, b, c] = [1, 2, 3]; var [[a,d] ...
- 泛型中? super T和? extends T的区别
原文出处: 并发编程网 经常发现有List<? super T>.Set<? extends T>的声明,是什么意思呢?<? super T>表示包括T在内的任何T ...
- Spring如何处理线程并发
Spring如何处理线程并发 我们知道Spring通过各种DAO模板类降低了开发者使用各种数据持久技术的难度.这些模板类都是线程安全的,也就是说,多个DAO可以复用同一个模板实例而不会发生冲突.我 ...
- Unity3D之Assetbundle
原地址: Unity3D之Assetbundle 有几个地方需要注意下 1.如何解决资源重复加载的问题 2.初始化了就直接出现在场景中了 感觉怪怪的 3.标红的地方要注意下 prefab上挂载的脚 ...
- 030 RDD Join中宽依赖与窄依赖的判断
1.规律 如果JoinAPI之前被调用的RDD API是宽依赖(存在shuffle), 而且两个join的RDD的分区数量一致,join结果的rdd分区数量也一样,这个时候join api是窄依赖 除 ...
- 029 RDD Join相关API,以及程序
1.数据集 A表数据: 1 a 2 b 3 c B表数据: 1 aa1 1 aa2 2 bb1 2 bb2 2 bb3 4 dd1 2.join的分类 inner join left outer jo ...
- Knowing how all your components work together: distributed tracing with Zipkin
转自: http://aredko.blogspot.com/2014/02/knowing-how-all-your-components-work.html In today's post we ...
随机推荐
- 【转载】latch: cache buffers chains
本文转自惜分飞的博客,博客原文地址:www.xifenfei.com/1109.html,支持原创,分享知识! 当一个数据块读入sga区,相应的buffer header会被放置到hash列表上,我们 ...
- ORACLE编译失效对象小结
在日常数据库维护过程中,我们会发现数据库中一些对象(包Package.存储过程Procedure.函数Function.视图View.同义词.....)会失效,呈现无效状态(INVALID).有时候需 ...
- Vim快捷键记录(工作中遇到)
一 移动类 1. 移动到文件首行 gg 2. 移动到文件末行 G 3. 移动到当前屏首行 H 4. 移动到当前屏末行 L 二 编辑类 1. 替换字符 r 2. 删除字符 x 3. 撤销编辑(还原被修改 ...
- PostgreSQL-角色、库、模式、表
由于不了解postgresql的psql工具,安装完数据库后就直接用pgadmin或navicat来连接操作,在确认初始化后的库中默认有些什么东西后竟然一直无处下手,在还没有了解pg大致体系的情况下搞 ...
- 删除Windows中隐藏的物理网卡和网络虚拟化失败后的虚拟网卡
Windows环境下,在更换硬件服务器主板和网卡等硬件.恢复操作系统或者网络虚拟化失败后,可能会出现网卡方面的问题.例如,设备管理器中多了不应该存在的网卡:因命名冲突无法重命名当前网络连接:IP地址冲 ...
- 理解 Keystone 核心概念 - 每天5分钟玩转 OpenStack(18)
作为 OpenStack 的基础支持服务,Keystone 做下面这几件事情: 管理用户及其权限 维护 OpenStack Services 的 Endpoint Authentication(认证) ...
- 15、sql语句集,Linux 下PHP查询mysql
一.mysql 创建数据库 mysql密码,默认没有 如果想更改的话, mysqladmin -uroot password root123 登录 : [root@localhost ro ...
- Linux终端打印命令使用介绍
常用linux打印命令 日常使用中或shell脚本中linux终端打印命令有echo和printf. echo命令 功能说明:显示文字.语 法:echo [-ne][字符串]或 echo [--he ...
- Flooded!
Flooded! Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 5955 Accepted: 1800 Specia ...
- android第一行代码-6.自定义控件的实现
0.假设一个应用中标题栏控件都是共用的,如果每个activity都需要设置button,绑定方法,那代码就会很臃肿.那我们可以自定义控件,然后继承这个控件就行了. 自定义控件为TitleLayout, ...