JavaScript对象继承


##将p中的属性复制到o中

function extend(o,p){

for(prop in p){

o[prop]=p[prop];

}

return o;

}


##生成一个新对象,拥有两者的属性,将o的属性复制到空对象中,再将p的属性复制到空对象中

function union(o,p){

return extend(extend({},o),p);

}


##Object.keys()返回对象中只有可枚举属性组成的数组,原理类似于

function keys(o){

if(o!==’object’) throw TypeError();

var res = [];

for(var prop in o){

if(o.hasOwnProperty(prop)){

res.push(prop);

}

}

return res;

}


Object.getOwnPropertyNames(Object);//获取Object对象自由的所有属性名称


##生成一个对象继承属性自p

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();

}



##对象的存取器属性(getter 和setter)

var o = {

a:”default value”,

set loc_a(nval){

this.a = nval

},

get loc_a(){

return this.a;

}

}

//##2 ———

var o = {

_a:”default”,

a:{

get:function(){

return this._a;

},

set:function(nval){

return this._a = nval;

}

}

}

//对比下普通对象的方法和存取器属性

var o = {

a:function(){

return Math.floor(Math.random()9)+1;

}

}

o.a(); //返回[1,10]之间的数

var o1 = {

get a(){

return Math.floor(Math.random()9)+1;

}

}

o1.a;// 返回[1,10]之间的数


##数据属性的四个特性

值(value)

可写(writable)

可枚举(enumerable)

可配置(configutable)


##存取器属性的四个特性

读(get)

写(set)

可枚举(enumerable)

可配置(configurable)


##ES5定义了个属性描述符来设置或查询属性特性


Object.getOwnPropertyDescriptor(obj,prop);//获取某个对象特定属性的属性描述符,注意prop要是字符串


返回一个对象(属性描述符对象)

{value:”xxx”,configurable:”xxx”,writable:”xxx”,enumerable:”xxx”}


##Object.defineProperty(obj,prop,properDescriptor)


##同时修改多个属性

Object.defineProperties(obj,{

val1:{value:”xxx”,writable:”xxx”,enumerable:”xxx”,configurable:”xxx”},

val2: {value:”xxx”,writable:”xxx”,enumerable:”xxx”,configurable:”xxx”},

val3: {value:”xxx”,writable:”xxx”,enumerable:”xxx”,configurable:”xxx”},

})


##扩展extend()方法

Object.defineProperty(Object.prototype,”extend”,{

writable:true,

enumerable:false,

configurable:true,

value:function(o){

var names =Object.getOwnPropertyNames(o);

for(var i=0;i<names.length;i++){

if(names[i] in this) continue;

var desc = Object.getOwnPropertyDescriptor(o,names[i]);

Object.defineProperty(this,names[i],desc);

}

}

})


##扩展Object.getOwnPropertyNames()为Object.getAllPropertyNames();//获取原型上可遍历的属性


Object.prototype.getAllPropertyNames = function(o){

// var props = Object.getOwnPropertyNames(o);

var props = Object.keys(o);

var allProps=[];

while(Object.getPrototypeOf(o)!==null){

o= Object.getPrototypeOf(o);

// allProps=props.concat(Object.getOwnPropertyNames(o))

allProps=allProps.concat(Object.keys(o));

}

return props.concat(allProps);

}

##构造函数创建的对象实例的proto属性指向构造函数的prototype属性

function G(){

}

var a = new G();

a.proto===G.prototype;//true


##Object.create(obj)创建的对象的原型指向obj

var a ={};

var c = Object.create(a);

c.proto===a;//true;


##获得对象的类型


function classOf(o){

if(o===null) return ‘Null’;

if(o===undefined) return ‘Undefined’;

return Object.prototype.toString.call(o).slice(8,-1);

}