Javascript权威指南--每日一读(对象啊~找对象啊~)

1.建立对象函数

  • 建立:对象直接量、new、Object,create()。this

  • 原型:每个对象(除了null)都和另外一个对象(原型)相关联,每一个对象都从原型继承属性(prototype)。prototype

//例如
new Array()、[]
//建立的对象都继承自Array.prototype;
//Array.prototype又继承自Object.prototype,由此构成的一系列………………………………就是原型链。
  • 建立对象create()的用法:code

//create():
var o = Object.create({a:1,b:2});
//若是create(null)的话,他建立的对象不继承任何。
var o1 = Object.create(Object.prototype);
//这样则和new Object()相同。

//经过原型建立新对象(模拟原型继承)
function inherit(p){
    if(p == null){
        throw TypeError();
    }
    if(Object.create){
        return Object.create(p);
    }
    var t = typeOf p;
    if(t != 'object' && t != 'function){
        throw TypeError();
    }
    function f(){};
    f.prototype = p;
    return new f();
}

2.继承对象

  • what is
    it?:假设一个对象obj,并查找他的属性o1,若是obj中存在则找到,若是不存在会在obj的原型中查找,若是还木有就在原型对象的原型上边查找,知道找到了或者原型为null了。继承

var obj = {};
obj.o1 = 1;
var p = inherit(obj)//前边写过的一个函数;
p.o2 = 2;
p.o1 = 2;
console.log(p.toString());//找到Object.prototype中的toString();
console.log(p.o1);//找到obj.prototype,结果是3,以前提到的不会修改原型链。
  • 属性访问错误:ip

var obj = {};
console.log(obj.v.length);//抛出异常,由于undefined没有length属性。
//能够用下边的方法↓
var len = obj&&obj.v&&obj.v.length;
//利用&&的“短路性”,并在有操做值为true的时候返回其返回值。

3.删除属性原型链

  • delete不能够删除继承属性,要删除就要在原型对象上删除,而且会影响全部继承它的对象。get

var obj = {a:1};
delete obj.a;//delete obj['a'];删除a属性;
delete obj.b;//true
delete obj.toString();//true
delete 1;//true

4.检测属性原型

  • in运算符:检测对象以及对象原型链上是否有某属性;

  • hasOwnProperty:检测对象自己是否有某属性;

  • propertyIsEnumerable:检测对象自己是否有某可枚举属性;

  • !==运算符:经过判断属性是否!==undefined;

5.枚举属性

  • for/in枚举:会枚举出自行添加的属性,须进行判断;

//经过判断来枚举
for(var i in obj){
    if(!obj.hasOwnProperty(i)) continue;
}
//经过extend来枚举↓一个不是很完善的extend
function extend(obj,obj1){
    for(var i in obj1){
        obj[i] = obj1[i]
    }
    return obj;
}
  • Object.keys()枚举:ES5;

  • Object.getOwnPropertyNames()枚举:ES5。

5.getter和setter

  • 获取和设置属性的方法

var obj = {
     val:100,
     get getval(){
         return this.val;
     },
     set setval(x){
         this.val = x;
     }
 }

6.属性的特性

  • 数据属性:值、可写性、可枚举性、可配置性。

  • 存取器属性:读取、写入、可枚举性、可配置性。

  • 经过Object.getOwnPropertyDescriptor()来获取自有特性。

  • 经过definedProperty()/definedProperties()设置属性的特性。

  • Stronger的extend();

Object.defineProperty(Object.prototype,"extend",{
    writable:true,
    emuerable:false,
    configration:true,
    value:function(obj){
        var names = Object.getOwnPropertyNames(obj);
        for(var i = 0 ; i <names.length ; i++){
            if(names[i] in this) continue;
            var temp = Object.getOwnPropertyDescriptor(obj,names[i]);
            Object.defineProperty(this,names[i],temp);
        }
    }
})
  • getter&setter老得API,非标准方法

_lookupGetter_
_lookupSetter_
_defineGetter_
_defineSetter_

7.原型属性

  • 用Object.getPrototypeOf()查询原型。

未完~~~

相关文章
相关标签/搜索