【书 JS语言精粹】第3章 对象

对于丑陋的事务,爱会闭目无视。

除了 数字,字符串,布尔值,null和undefined,其他都是对象。

Js中的对象是可变的键控集合(keyed collections)

对象是属性的容器,每个属性都有属性名和属性值。(key    --------    value)

因为js中的对象是无类型的,所以他的属性名和值也无限制,于是,他可以很容易的去表示树状和图形结构。

js包含一种原型链的特性

原型链的存在  →_→    允许对象去继承另一个对象的属性  

(你没有的属性,还想用,可以偷一个)

正确的使用原型链,可以减少对象初始化时消耗的时间和内存。

  1. 对象字面量 (Object )(对象是可嵌套的,怎么感觉跟json似的~~~)
  2. 检索(Retrieval)(取得对象的属性的时候,你可以   ① 对象[属性名]   ② 对象.属性名.子属性名。。。另,如果你尝试取得一个并存在的属性名的值得场合,将会被返回undefined。  另另,|| 运算符 当你返回undefined  ,||  这个运算符的使用可以帮助你返回一个默认值。比如,var  aaa  = 对象1[属性名] || 默认值 。另另另,尝试从undefined的成员属性中取值将会导致TypeError异常。这是可以通过&& 来避免异常 。比如,1.对象.属性名  =》 undefined 2.对象.属性名.子属性名  =》 throw TypeError异常。3. 可以通过&& 来避免异常的抛出 (即:对象.属性名 && 对象.属性名.子属性名)这是因为&& 运算符,前半句不得成全的时候,根本就不会再去执行后半句。所以可避免异常,就好像你确认了这个对象是存在的,才能再从这个对象当中去取东西的感觉一样。)
  3. 更新(Update)(对象的值可以通过赋值语句来更新。① 该属性名已经存在的场合,就会覆盖掉该属性名下的value值。②f 如果该属性名不存在,则该属性名就会被扩张到对象当中。也就是存在就update,不存在就insert)
  4. 引用(Reference)(对象是同通过引用来传递,他们永远不会被复制)
    // 案例①
    var x = stooge; // x対象 ➡ stooge 
    x.nickname = 'xxxxxx' ; // x 対象 変化の場合、対象stooge も変化する。 
    var nick = stooge.nickname; // そして、nick は「'xxxxxx'」 以上。
    
    
    // 案例②
    var a = {},b = {}, c = {};// 三つ 空対象
    a = b = c = {}; // 一つ 空対象
  5. 原型(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);
  6. 反射(Reflection)(typeof 可以检查对象,并且确认对象有什么属性)(有两种方法可以去处理掉不需要的属性,一个是因为,你做程序的时候,当你更关心的是那些,值属性的时候,就是更关心的是数据,而不是函数的时候,你可以选择让你的程序做检查并且丢弃掉值为函数的属性;另一种是使用hasOwnProperty方法,如果拥有独立属性,那么返回真。这个方法不会检查原型链的。)
  7. 枚举(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]]);
    }
  8. 删除(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);

    运行结果

  9. 减少全局变量污染(Global Abatement)将全局性的资源,都纳入到一个空间名字下,你的程序与其他程序,组件或者类库之间发生冲突的可能性就会显著降低。(另,闭包函数也是另一种解决全局污染的方法。)

你可以不够优秀,但如果对自己不满,请足够成长~~~

下一章 函数 是重头戏~~~

猜你喜欢

转载自blog.csdn.net/MENGCHIXIANZI/article/details/106001029
今日推荐