/images/avatar.jpeg
写过点代码读过点书

JS 中 Object.defineProperty 的使用方法

1、Object.defineProperty() 方法会直接在一个对象上定义一个新属性,或者修改一个对象的现有属性, 并返回这个对象,语法如下: Object.defineProperty(obj, prop, descriptor) 其中: obj是需要被操作的目标对象 prop是目标对象需要定义或修改的属性的名称 descriptor是将被定义或修改的属性的描述符 函数将返回被传递给函数的对象 2、一个简单的实例: 1 2 var o = {}; Object.defineProperty(o, "a", { value: 37 }); //{a: 37} 上述代码中,我们用Object.defineProperty为对象 o 创建的了一个新属性 a,它的值为 37,但是我们也发现了一些问题,参考如下代码: 1 2 3 4 5 var o = {}; Object.defineProperty(o, "a", { value: 37 }); //{a: 37} console.log(o.a); // 打印 37 o.a = 25; // 没有错误抛出(在严格模式下会抛出,即使之前已经有相同的值) console.log(o.a); // 打印 37, 赋值不起作用。 我们发现,对 o.a 赋值似乎不起作用,原来Object.defineProperty的第三个参数descriptor有很多属性描述符,其中就有是否能被赋值运算符改变 value的属性描述符。 3、具体的属性描述符如下: configurable 当且仅当该属性的 configurable 为 true 时,该属性描述符才能够被改变,同时该属性也能从对应的对象上被删除。默认为 false。 enumerable 当且仅当该属性的 enumerable 为 true 时,该属性才能够出现在对象的枚举属性中**(可以被 for.

Object.create

1、Object.create() 方法会使用指定的原型对象及其属性去创建一个新的对象,语法如下: Object.create(proto, [ propertiesObject ]) 其中: proto一个对象,新创建对象的原型 propertiesObject可选。该参数对象是一组属性与值,该对象的属性名称将是新创建的对象的属性名称,值是属性描述符(这些属性描述符的结构与Object.defineProperties()的第二个参数一样)。 函数将返回一个定原型对象上添加新属性后的新对象 如果 propertiesObject 参数不是 null 也不是对象,则抛出一个 TypeError 异常。 2、一些例子: 1 2 3 4 var a = { v: 41 }; var b = Object.create(a); b.__proto__ === a; //true //Object.create返回的对象的原型是其第一个参数。 1 2 3 o = {}; // 以字面量方式创建的空对象就相当于: o = Object.create(Object.prototype); 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 o = Object.create(Object.prototype, { // foo会成为所创建对象的数据属性 foo: { writable: true, configurable: true, value: "hello", }, // bar会成为所创建对象的访问器属性 bar: { configurable: false, get: function () { return 10; }, set: function (value) { console.

jsonp 的一般原理

由于同源策略,一般来说位于 server1.example.com 的网页无法与不是 server1.example.com 的服务器沟通,这时候 Jsonp 可以帮助我们进行跨域的数据交互,另一个解决这个问题的新方法是CORS,咱们今天主要聊聊 Jsonp。 一、JSONP 是怎么产生的 1、由于同源策略的存在,Ajax 直接请求数据存在跨域无权限访问的问题。 2、但我们又发现,Web 页面上调用 js 文件时则不受是否跨域的影响(不仅如此,我们还发现凡是拥有"src"这个属性的标签都拥有跨域的能力,比如<script>、<img>、<iframe>); 3、于是可以判断,当前阶段如果想通过纯 web 端(ActiveX 控件、服务端代理、属于未来的 HTML5 之 Websocket 等方式不算)跨域访问数据就只有一种可能,那就是在远程服务器上设法把数据装进 js 格式的文件里,供客户端调用和进一步处理; 4、恰巧我们已经知道有一种叫做 JSON 的纯字符数据格式可以简洁的描述复杂数据,更妙的是 JSON 还被 js 原生支持,所以在客户端几乎可以随心所欲的处理这种格式的数据; 5、这样子解决方案就呼之欲出了,web 客户端通过与调用脚本一模一样的方式,来调用跨域服务器上动态生成的 js 格式文件(一般以 JSON 为后缀),显而易见,服务器之所以要动态生成 JSON 文件,目的就在于把客户端需要的数据装入进去。 6、客户端在对 JSON 文件调用成功之后,也就获得了自己所需的数据,剩下的就是按照自己需求进行处理和展现了,这种获取远程数据的方式看起来非常像 AJAX,但其实并不一样。 7、为了便于客户端使用数据,逐渐形成了一种非正式传输协议,人们把它称作 JSONP,该协议的一个要点就是允许用户传递一个 callback 参数给服务端,然后服务端返回数据时会将这个 callback 参数作为函数名来包裹住 JSON 数据,这样客户端就可以随意定制自己的函数来自动处理返回数据了。 二、JSONP 的客户端具体实现 不管 jQuery 也好,extjs 也罢,又或者是其他支持 jsonp 的框架,他们幕后所做的工作都是一样的,下面我来循序渐进的说明一下 jsonp 在客户端的实现: 1、我们知道,哪怕跨域 js 文件中的代码(当然指符合 web 脚本安全策略的),web 页面也是可以无条件执行的。 远程服务器 remoteserver.

为“黄牛”正名

每逢春运,都避不开一个话题,那就是“黄牛”。今年也不例外,甚至前些天的天价挂号费事件让这个话题来的更早了一些。 火车站里,黄牛的身影总是与上涨的价格联系在一起,许多乘客只看到这一层表象,随即便指责黄牛乘人之危,囤积居奇,是火车票难买的罪魁祸首。但是乘客们真的骂错人了,要不然,为什么黄牛不一年 365 天整天蹲在火车站卖票? “黄牛”是无辜的,我写这篇文章,也是想给“黄牛”正名。 首先问一个问题:是谁让火车票变得这么难买?乘客可以拿一块镜子出来看看,答案就在镜子里。正是因为乘客暴增,才导致一票难求。但是乘客也是一个巴掌拍不响,如果让市场自由调节,让供不应求的火车票适当提高价格,火车票难买的状况就会被一举改善。但是问题就在于铁路具有垄断性质,国家不让涨价啊!” 正是因为过低的票价,请来了黄牛党,他们并没有与乘客争利,他们只是瓜分了本该属于铁路部门的利润。事实上,黄牛“修正”了火车票的真实的价格,他们给出了火车票更合理的市场价格。 我们应该清楚地认识到,万事万物,其真实的价格不是由某人或者某个机构就可以随意定制的。即使刻意压低一件商品的明面价格,消费者也要付出额外的隐性成本。例如政府一旦提供了低价车票,便出现了黄牛党,或者你要在排队上付出更多的时间成本;提供低价的医疗,就会出现前不久发生的天价挂号费事件,或者你要塞医生红包。 相似的事情同样在美国发生过,1973 年时,当时的那些石油输出国组织对美国进行石油抬价,按理说美国国内的石油价格应该相应上涨,但是尼克松总统认为石油价格事关民生,禁止油品价格的上涨,取而代之的是各种各样的行政管制。虽然油品的价格确实控制住了,但这并没有解决问题,只是把问题推到了别的方向,其中之一就是加油站排起了长长的队伍,给民众徒增了很多排队成本。 政府的本意是好的,为民众提供更廉价的社会服务,但是当公共服务设施与其价格不匹配时,政府的好心基本就白费了,民众付出的“全部价格”没有变化,有时甚至会付出更多的代价。本该是国家库房的收入也被白白浪费掉了。 有人说春运的解决之道,不是提高票价,而是应该让政府解除对铁路的垄断,让民间资本自由竞争。解除垄断当然是好,但是春运提价还是在所难免,那是因为需求激增的太快。也有人说可以像阿三人民那样爬满火车头,那样的话火车的载客能力会大大增强,但那要极大考验乘客的抓握能力和耐寒能力,况且政府也不会允许这样的违法行为发生。 在我看来,铁道部当初在定价策略上就犯了一个原则性的错误,不应该一开始就制定过低的票价。他们应该向航空公司学习,平时票价打折,以给老百姓廉价的车票,每逢节日就少打折或者不打折,这样的变相涨价老百姓也无话可说,并且更容易接受。春运问题也迎刃而解。 事实上,花更多钱买了黄牛票的乘客,其实也没有理由指责黄牛。因为这笔交易完全是出于你自愿的,没有人强迫你这么做。这说明这张票相对于你付出的钱是值得的。 民众对“黄牛”的普遍敌视,还有很大一部分原因出于对中介的固有成见。“黄牛”其实就是一种中介。 在国人的固有印象中,中介没有生产任何东西,所以他们没有为社会创造任何财富,但是这个观点是完全错误的。价值并不来源于劳作,一个花了大量时间精力造出来的楼房,如果没有人要他,那他就一文不值。大明星花几秒钟写出来的签名,如果众人哄抢,同样价值过万。要想了解一样东西的价值是多少,那要看别人愿意花多少钱买下它。 如果一个人拥有某样东西,而另一个人对这样东西的估值高于拥有者对他的估值,中介可以把买方与卖方与卖方联系起来,结果是他们双方都受益,他们的处境都得到相应的改善,中介也可以从中得到一笔可观的薪酬。 事实上,对于现代社会经济制度不完善、信息普遍不对称的情况,中介的存在是非常重要甚至必要的,它能使整个社会的经济资源得到更合理的配置,更大的提高经济的效率和效益。 有时中介的必要甚至是人命关天的,18 世纪法国和英国都时常有饥荒发生,但是英国却绝少有人饿死,而法国很多地方却横尸遍野。究其原因,当时法国人认为商人低价收购粮食然后去粮食短缺的地方卖出是不道德的,法国政府明令也禁止这种行为。商人们不能安心地做生意,饥饿的人也得不到他们想要的粮食,因此造成了这种悲剧。 由此可见,中介在社会生产过程中发挥着非常重要的作用。反观“黄牛”,他们为铁道部门畸形的定价策略提供了一种解决方案,优化了资源分配。固然他们制定了非常高的票价,但这也恰好才能甄别出对火车票有最迫切需求的人,让他们无需排队买票,无需耗费时间成本,就能立刻上车与家人团聚。 事实上,任何存活的中间商,都必定做出了为消费者以钞票所承认的、难以替代的贡献。究竟是什么贡献,读者自己要好好想一想。不把这点想通,就不会明白为什么改革开放后,国家要废除“投机倒把罪”,就不会明白社会最基本的经济运行规律。“黄牛”也好,房地产中介商也罢,他们都为社会做出了不可磨灭的贡献,民众们不应该带着有色眼镜去看待他们。