对于丑陋的事务,爱会闭目无视。
除了 数字,字符串,布尔值,null和undefined,其他都是对象。
Js中的对象是可变的键控集合(keyed collections)
对象是属性的容器,每个属性都有属性名和属性值。(key -------- value)
因为js中的对象是无类型的,所以他的属性名和值也无限制,于是,他可以很容易的去表示树状和图形结构。
js包含一种原型链的特性
原型链的存在 →_→ 允许对象去继承另一个对象的属性
(你没有的属性,还想用,可以偷一个)
正确的使用原型链,可以减少对象初始化时消耗的时间和内存。
- 对象字面量 (Object )(对象是可嵌套的,怎么感觉跟json似的~~~)
- 检索(Retrieval)(取得对象的属性的时候,你可以 ① 对象[属性名] ② 对象.属性名.子属性名。。。另,如果你尝试取得一个并存在的属性名的值得场合,将会被返回undefined。 另另,|| 运算符 当你返回undefined ,|| 这个运算符的使用可以帮助你返回一个默认值。比如,var aaa = 对象1[属性名] || 默认值 。另另另,尝试从undefined的成员属性中取值将会导致TypeError异常。这是可以通过&& 来避免异常 。比如,1.对象.属性名 =》 undefined 2.对象.属性名.子属性名 =》 throw TypeError异常。3. 可以通过&& 来避免异常的抛出 (即:对象.属性名 && 对象.属性名.子属性名)这是因为&& 运算符,前半句不得成全的时候,根本就不会再去执行后半句。所以可避免异常,就好像你确认了这个对象是存在的,才能再从这个对象当中去取东西的感觉一样。)
- 更新(Update)(对象的值可以通过赋值语句来更新。① 该属性名已经存在的场合,就会覆盖掉该属性名下的value值。②f 如果该属性名不存在,则该属性名就会被扩张到对象当中。也就是存在就update,不存在就insert)
- 引用(Reference)(对象是同通过引用来传递,他们永远不会被复制)
// 案例① var x = stooge; // x対象 ➡ stooge x.nickname = 'xxxxxx' ; // x 対象 変化の場合、対象stooge も変化する。 var nick = stooge.nickname; // そして、nick は「'xxxxxx'」 以上。 // 案例② var a = {},b = {}, c = {};// 三つ 空対象 a = b = c = {}; // 一つ 空対象
- 原型(Prototype)(所有对象都会链接到js的标配对象,Object.prototype,并且从中继承属性)(原型链接在更新的时候是不起作用的,原型链接只有在检索的时候,才会发生作用。当尝试获取原型对象的某个属性值的时候,会一路向父级别去寻找,直到Object类型。
// 我们将给Object添加一个create方法 if(typeof Object.beget ! = "function"){ Object.create = function(o){ var F = function(){}; F.prototype = o; return new F(); }; } var another_stooge = Object.create(stooge);
- 反射(Reflection)(typeof 可以检查对象,并且确认对象有什么属性)(有两种方法可以去处理掉不需要的属性,一个是因为,你做程序的时候,当你更关心的是那些,值属性的时候,就是更关心的是数据,而不是函数的时候,你可以选择让你的程序做检查并且丢弃掉值为函数的属性;另一种是使用hasOwnProperty方法,如果拥有独立属性,那么返回真。这个方法不会检查原型链的。)
- 枚举(Enumeration)(for in 语句可以遍历一个对象的所有属性名。可以使用typeof 或者 hasOwnProperty 来排除掉你并不关心的那一些属性)
// 过滤器排除掉属性是函数的属性 var name ; for (name in another_stooge){ if(typeof anotherstooge[name] != "function"){ document.writeln(name + ':' + anotherstooge[name]); } } // 属性名出现的顺序是不一定的,如果需要属性名按照顺序来出现的话,定义一个数组,并且在数组当中规定出来你希望的出现顺序 var i; var propertise = [ "属性名1", "属性名2", "属性名3" ] for (i = 0;i < propertise.length ; i++) { document.writeln(propertise[i] + ': ' + nother_stooge[propertise[i]]); }
- 删除(Delete)(书中说的和给的例子,感觉不是很好理解。原话就是:delete可以删除对象的属性,该属性存在,就会被移除,但是不会触及原型链中的任何对象。这个帖子还好点哈 传送门)另,结合上面,再一次说明一下delete的前世今生。
// 【对象字面量】 var stooge = { "first-name" : "Jerome", "last-name" : "Hoeard" } // stooge 最一开始的模样 // 【更新】 stooge.nickname = "Curly"; // stooge 对象扩展一个nickname 的属性 // 【引用】 var x = stooge; // x対象 ➡ stooge x.nickname = 'xxxxxx' ; // x 対象 変化の場合、対象stooge も変化する。 var nick = stooge.nickname; // そして、nick は「'xxxxxx'」 以上。 console.log("nick ======= " + nick); // 【退避】 stooge.nickname = "Curly"; // stooge 对象扩展一个nickname 的属性 // 妈呀这还有神操作呢 // 我们将给Object添加一个create方法 if(typeof Object.beget != "function"){ // 创建一个使用原对象作为其原型的新对象 // 形参 o 就是要作为原型的原对象 Object.create = function(o){ var F = function(){}; // 赋值给新对象 F.prototype = o; // 返回创建好的新对象 return new F(); }; } var another_stooge = Object.create(stooge); // 调用 another_stooge.nickname = "Mox"; // another_stooge 重命名 // delete的使用 console.log("another_stooge.nickname【delete前】 ======= " + another_stooge.nickname); delete another_stooge.nickname; // 删除对象的属性可能会让来自原型链中的属性透现出来 console.log("another_stooge.nickname【delete后】 ======= " + another_stooge.nickname);
运行结果
- 减少全局变量污染(Global Abatement)将全局性的资源,都纳入到一个空间名字下,你的程序与其他程序,组件或者类库之间发生冲突的可能性就会显著降低。(另,闭包函数也是另一种解决全局污染的方法。)
你可以不够优秀,但如果对自己不满,请足够成长~~~
下一章 函数 是重头戏~~~