• 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()//在一个对象的上下文中应用另一个对象的方法;参数能够以列表形式传入
  • 相关阅读:
    《微风吹过的街道》Alpha冲刺Scrum meeting5
    《微风吹过的街道》Alpha冲刺Scrum meeting4
    小明分蛋糕题解
    小明分蛋糕(附题解)
    正确答案
    阴影面积
    双面打印
    实验十 团队作业6:团队项目用户验收&Beta冲刺
    你说什么都不对【Beta】Scrum meeting 4
    你说什么都不队【Beta】Scrum meeting 3
  • 原文地址:https://www.cnblogs.com/weihexinCode/p/12317637.html
Copyright © 2020-2023  润新知