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()//在一个对象的上下文中应用另一个对象的方法;参数能够以列表形式传入