javascript 对象api
25 // Object 构造函数的属性: 26 Object.prototype//可以为所有 Object 类型的对象添加属性 27 28 class A extends B{ 29 constructor(){ 30 super(); 31 } 32 } 33 34 35 36 37 // Object 构造函数的方法: 38 39 //Object.assign(目标对象, 要复制的对象)//通过复制一个或多个对象来创建一个新的对象 40 //方法用于将所有可枚举属性的值从一个或多个源对象复制到目标对象。它将返回目标对象。 41 //不会拷贝目标对象的继承对象(不会拷贝prototype属性) 42 //返回 目标对象 43 44 //Object.create() 45 //使用指定的原型对象和属性创建一个新对象 46 //Object.create()方法会继承指定的原型对象的属性和方法去创建一个新的对象。 47 //该方法接收两个参数,其中第一个参数是这个新创建的对象的原型, 48 //第二个是可选参数,与Object.definePropertperties()方法的第二个参数格式相同。 49 50 //defineProperty(要在其上定义属性的对象, 要定义或修改的属性的名称, 将被定义或修改的属性描述符); 51 { 52 //方法会直接在一个对象上定义一个新属性,或者修改一个对象的现有属性, 并返回这个对象! 53 //属性描述符:描述符必须是这两种形式之一;不能同时是两者 54 //数据描述符()/存储描述符(存取描述符)(作用于 get set 的描述符) 55 // configurable enumerable value writable get set 56 57 //数据描述符: Yes Yes Yes Yes No No 58 59 //存储描述符: Yes Yes No No Yes Yes 60 61 //数据描述符 默认值: 62 //value : 1, 63 //writable : true, 64 //configurable : true, 65 //enumerable : true 66 67 //存储描述符 默认值: 68 //value : 1, 69 //writable : false, 70 //configurable : false, 71 //enumerable : false 72 // 例: 73 class MyName{ 74 constructor(){ 75 //super(); 76 this.name = 'n'; 77 } 78 } 79 let myname = new MyName(); 80 81 Object.defineProperty(myname, 'name', { 82 configurable:false,//false不可被配置,删除, 但可以配置 writable和value,默认值为true 83 enumerable:false,//flase为不能被递归,默认值为true 84 writable:false,//flase属性的值为:不可写,只读,默认值为true 85 value:'lizi' //修改对象属性的默认值(数值,对象,函数等) 86 }); 87 88 //例 修改prototype属性 89 function myclass() { 90 } 91 var value; 92 Object.defineProperty(myclass.prototype, "x", { 93 get() { 94 return value; 95 }, 96 set(x) { 97 value = x; 98 } 99 }); 100 101 var a = new myclass(); 102 var b = new myclass(); 103 a.x = 1; 104 console.log(a.x);// 1 105 console.log(b.x); // 1 106 107 //例 自存档 日志 1 108 function Archiver() { 109 var temperature = null; 110 var archive = []; 111 112 Object.defineProperty(this, 'temperature', { 113 get: function() { 114 console.log('get!'); 115 return temperature; 116 }, 117 set: function(value) { 118 temperature = value; 119 archive.push({ val: temperature }); 120 } 121 }); 122 123 this.getArchive = function() { return archive; }; 124 } 125 126 var arc = new Archiver(); 127 arc.temperature; // 'get!' 128 arc.temperature = 11; 129 arc.temperature = 13; 130 arc.getArchive(); // [{ val: 11 }, { val: 13 }] 131 132 //例 自存档 日志 2 133 var pattern = { 134 get: function () { 135 return 'I alway return this string,whatever you have assigned'; 136 }, 137 set: function () { 138 this.myname = 'this is my name string'; 139 } 140 }; 141 142 function TestDefineSetAndGet() { 143 Object.defineProperty(this, 'myproperty', pattern); 144 } 145 146 var instance = new TestDefineSetAndGet(); 147 instance.myproperty = 'test'; 148 149 // 'I alway return this string,whatever you have assigned' 150 console.log(instance.myproperty); 151 // 'this is my name string' 152 console.log(instance.myname);//继承属性 153 } 154 155 156 157 //defineProperties(obj, 将被定义或修改的属性描述符)(在其上定义或修改属性的对象, ); 158 { 159 //多条修改(给对象添加多个属性并分别指定它们的配置) 160 //例:要定义其可枚举属性或修改的属性描述符的对象 161 var obj = {}; 162 Object.defineProperties(obj, { 163 'property1': { 164 value: true, 165 writable: true 166 }, 167 'property2': { 168 value: 'Hello', 169 writable: false 170 } 171 }); 172 } 173 174 175 176 //Object.entries(obj);//返回给定对象自身可枚举属性的 [key, value] 数组 177 { 178 //for in 区别:Object.entries 不会枚举原型链上的属性 179 //例1 180 const obj = { foo: 'bar', baz: 42 }; 181 console.log(Object.entries(obj)); // [ ['foo', 'bar'], ['baz', 42] ] 182 183 //例2 184 for (let [key, value] of Object.entries(obj)) { 185 console.log(`${key}: ${value}`); 186 } 187 //Object.values()//返回给定对象自身可枚举值的数组 188 //Object.keys()//返回一个包含所有给定对象自身可枚举属性名称的数组 189 } 190 191 192 193 //Object.freeze(obj);//冻结目标对象 其他代码不能删除 或 更改任何属性 194 { 195 //Object.isFrozen(obj)//判断对象是否已经冻结 196 //冻结的对象: 197 //Object.freeze(obj)//作用于构造函数 198 //Object.freeze(obj.prototype)//作用于目标原型链 199 //不能添加属性; 200 //不能删除属性 201 //不能修改属性; 202 //不能重定义属性; 203 //返回和传入的参数相同的对象 204 //例 205 let obj = { 206 prop: 42, 207 config:{} 208 }; 209 Object.freeze(obj); 210 obj.prop = 33; 211 console.log(obj.prop);//42 212 obj.config.a = 1; 213 console.log(obj.config.a);//1 214 } 215 216 217 218 //Object.seal(obj)//防止其他代码删除对象的属性, 封闭一个对象(但属性的值仍然可以修改) 219 { 220 //Object.isSealed(obj);//判断是否是一个封闭对象 221 //密封的对象: 222 //不能添加新属性, 223 //不可配置属性。 224 //不能成为访问器属性 225 //不可删除, 226 //不能被重新定义 227 //不会影响从原型链上继承的属性。但 __proto__ ( ) 属性的值也会不能修改。 228 //返回被密封对象的引用。 229 //例 230 var obj = { 231 prop: function() {}, 232 foo: 'bar' 233 }; 234 var o = Object.seal(obj); 235 o === obj; // true 236 Object.isSealed(obj); //true 237 } 238 239 240 241 //Object.preventExtensions(obj)//防止对象的任何扩展 242 { 243 //对象变得不能扩展,也就是永远不能再添加新的属性 244 //仅阻止添加自身的属性。但属性仍然可以添加到对象原型 245 246 //Object.isExtensible(obj) //判断一个对象是否是可扩展的(是否可以在它上面添加新的属性) 247 //默认情况下,对象是可扩展的:即可以为他们添加新的属性。以及它们的 __proto__ 属性可以被更改。 248 //Object.preventExtensions,Object.seal 或 Object.freeze 方法都可以标记一个对象为不可扩展(non-extensible) 249 //例 250 // 新对象默认是可扩展的. 251 var empty = {}; 252 Object.isExtensible(empty); // === true 253 // ...可以变的不可扩展. 254 Object.preventExtensions(empty); 255 Object.isExtensible(empty); // === false 256 // 密封对象是不可扩展的. 257 var sealed = Object.seal({}); 258 Object.isExtensible(sealed); // === false 259 // 冻结对象也是不可扩展. 260 var frozen = Object.freeze({}); 261 Object.isExtensible(frozen); // === false 262 } 263 264 265 266 //Object.getOwnPropertyDescriptor(需要查找的目标对象, 目标对象内属性名称); //返回属性特性配置 267 { 268 //方法返回指定对象上一个自有属性对应的属性描述符(自有属性:对象自身属性,不包括原型链, 属性描述符:属性配置) 269 //如果指定的属性存在于对象上,则返回其属性描述符对象(property descriptor),否则返回 undefined 270 //例 271 obj = { get foo() { return 17; } }; 272 d = Object.getOwnPropertyDescriptor(obj, "foo"); 273 // d { 274 // configurable: true, 275 // enumerable: true, 276 // get: /*the getter function*/, 277 // set: undefined 278 // } 279 280 //Object.getOwnPropertyNames(obj)//方法返回一个由指定对象的所有自身属性的属性名(包括不可枚举属性但不包括Symbol值作为名称的属性)组成的数组。 281 //例 282 var arr = ["a", "b", "c"]; 283 console.log(Object.getOwnPropertyNames(arr).sort()); // ["0", "1", "2", "length"] 284 } 285 286 287 288 //Object.getOwnPropertySymbols(obj) 方法返回一个给定对象自身的所有 Symbol 属性的数组 289 { 290 //例 291 var obj = {}; 292 var a = Symbol("a"); 293 var b = Symbol.for("b"); 294 obj[a] = "localSymbol"; 295 obj[b] = "globalSymbol"; 296 var objectSymbols = Object.getOwnPropertySymbols(obj); 297 298 console.log(objectSymbols.length); // 2 299 console.log(objectSymbols) // [Symbol(a), Symbol(b)] 300 console.log(objectSymbols[0]) // Symbol(a) 301 } 302 303 304 305 //Object.getPrototypeOf(obj) 方法返回指定对象的原型(内部[[Prototype]]属性的值) 306 { 307 //例 308 const prototype1 = {}; 309 const object1 = Object.create(prototype1); 310 console.log(Object.getPrototypeOf(object1) === prototype1);// expected output: true 311 } 312 313 314 315 //Object.is(value1, value2);//方法判断两个值是否是相同的值 316 { 317 //和传统的 == 运算不同,== 运算符会对它两边的操作数做隐式类型转换, Object.is 不会做这种类型转换 318 //这与 === 运算符的判定方式也不一样。=== 运算符(和== 运算符)将数字值 -0 和 +0 视为相等,并认为 Number.NaN 不等于 NaN 319 //例 320 Object.is('foo', 'foo'); // true 321 Object.is(window, window); // true 322 Object.is('foo', 'bar'); // false 323 Object.is([], []); // false 324 var foo = { a: 1 }; 325 var bar = { a: 1 }; 326 Object.is(foo, foo); // true 327 Object.is(foo, bar); // false 328 Object.is(null, null); // true 329 // 特例 330 Object.is(0, -0); // false 331 Object.is(0, +0); // true 332 Object.is(-0, -0); // true 333 Object.is(NaN, 0/0); // true 334 } 335 336 337 338 //Object.setPrototypeOf() 方法设置一个指定的对象的原型 ( 即, 内部[[Prototype]]属性)到另一个对象或 null 339 // 该方法运行较慢,影响性能,不赞成使用 340 341 342 343 344 //get set :(给属性加把锁!) 345 { 346 // --------------------------------------------------------------------------例1 347 /* let myname = { 348 name : 'n', 349 age : undefined, 350 fun : function (){console.log(this);}, 351 get name(){ 352 console.log('this get'); 353 return name; 354 }, 355 set name(v){ 356 console.log('this set'); 357 name = v; 358 } 359 }; */ 360 361 // -------------------------------------------------------------------------- 例2 362 /* function MyName(){ 363 let name = 'n';//this.name === name; 364 let age = 1; 365 Object.defineProperty(this, 'age', { 366 get:function (){ 367 console.log('this get'); 368 return age; 369 }, 370 set:function (v){ 371 console.log('this set'); 372 age = v; 373 } 374 375 }); 376 Object.defineProperties(this, { 377 name:{ 378 get : function (){ 379 console.log('this get'); 380 return name; 381 }, 382 set : function (v){ 383 console.log('this set'); 384 name = v; 385 } 386 } 387 }); 388 } 389 let myname = new MyName(); */ 390 391 // -------------------------------------------------------------------------- 例3 392 /* class MyName{ 393 constructor(){ 394 //super(); 395 this.config = {name:'n'}; 396 //this.name; 397 //this.color = 'red'; 398 } 399 400 get name() { 401 console.log('this get'); 402 return this.config.name; 403 } 404 405 set name(v) { 406 if(v){ 407 console.log('this set'); 408 this.config.name = v; 409 } 410 } 411 412 } 413 let myname = new MyName(); */ 414 } 415 416 417 418 419 420 421 422 //Object 实例和 Object 原型对象 423 //继承: 424 425 //属性: 426 427 //Object.prototype.constructor 428 //返回创建实例对象的 Object 构造函数的引用。 429 //注意,此属性的值是对函数本身的引用,而不是一个包含函数名称的字符串。对原始类型来说,如1,true和"test",该值只可读 430 //例 431 var o = {}; 432 o.constructor === Object; // true 433 434 var o = new Object; 435 o.constructor === Object; // true 436 437 var a = []; 438 a.constructor === Array; // true 439 440 var a = new Array; 441 a.constructor === Array // true 442 443 var n = new Number(3); 444 n.constructor === Number; // true 445 446 447 //方法: 448 Object.prototype.isPrototypeOf()//返回一个布尔值,表示指定的对象是否在本对象的原型链中 449 object.prototype.hasOwnProperty(property)//返回一个布尔值 ,表示某个对象是否含有指定的属性,而且此属性非原型链继承的 450 Function.prototype.apply()//在一个对象的上下文中应用另一个对象的方法;参数能够以数组形式传入 451 Function.prototype.call()//在一个对象的上下文中应用另一个对象的方法;参数能够以列表形式传入