var f = function() {}
// ES5及以前:函数名为 ""
// ES6以后:函数名为 函数名.name
console.log(f.name); // f
● bind 绑定的函数的name为 bound foo
function foo() {}
console.log(foo.bind({}).name); // bound foo
// console.log(foo.call({}).name); // 报错
// console.log(foo.apply({}).name); // 报错
const foo = "bar";
const bar = { foo };
console.log(bar); // { foo: 'bar' }
let foo = (a = 1, b = 2) => ({
a, b
});
console.log(foo()); // {a: 1, b: 2}
let age = 12;
const p = {
age,
say() {
console.log(this.age);
}
}
console.log(p.age);
p.say();
// index.js
let a = 1;
function foo() {
console.log('foo');
}
function bar() {
console.log('bar');
}
const obj = {
a,
foo,
bar
}
module.exports.obj = obj;
// main.js
const {
a,
foo,
bar
} = require('./index.js').obj;
console.log(a, foo, bar); // 1 [Function: foo] [Function: bar]
const arr = [1, 2, 3];
console.log(arr[1]); // 2
console.log(arr['1']); // 2
const obj = {}
obj.foo = true;
console.log(obj); // {obj: true}
obj['f' + 'oo'] = false;
console.log(obj); // {obj: false}
let a = 'hello',
b = 'world';
const obj = {
[a + b]: true
}
console.log(obj); // {helloworld: true}
const obj = {
['hello' + b]: 123
}
console.log(obj); // {helloworld: 123}
const obj = {
['hello' + 'world']: undefined
}
console.log(obj); // {helloworld: undefined} 注意这里是undefined
var obj = {};
obj[true] = 'foo';
obj[3] = 'bar';
obj[obj] = 'baz';
console.log(obj['true']); // foo
console.log(obj['3']); // bar
console.log(obj[obj]); // baz
console.log(obj['obj']); // undefined
console.log(obj['[object Object]']); // baz
console.log(Boolean.prototype.toString.call(true)); // true
console.log(Number.prototype.toString.call(12)); // 12
const a = {a : 1},
b = {b : 2};
const obj = {
[a]: 'a',
[b]: 'b'
}
console.log(obj); // {'[object Object]': 'b'}
const p = {
sayName() {}
}
console.log(p.sayName.name); // sayName
● ES5之前并没有提供检测属性的方法
● ES5之后提供了一个属性描述符
● 该方法getOwnPropertyDescriptor是存在于Object的构造器上
● 作用:获取对象的描述符
const obj = {
a: 1
};
console.log(Object.getOwnPropertyDescriptor(obj, 'a'));
// {
// configurable: true
// enumerable: true
// value: 1
// writable: true
// }
● configurable: true 可配置的,默认是true
● enumerable: true 可枚举的,默认是true
● value: 1 值
● writable: true 可写的,默认是true
const obj = {};
Object.defineProperty(obj, 'a', {
configurable: true,
enumerable: true,
value: 2,
writable: false
});
obj.a = 333; // 在非严格模式下,静默失败;在严格模式下,他会报错
console.log(obj); // {a: 2}
delete obj.a; // 注意:这里已经不可写了,但是可以删除
console.log(obj); // {}
// 变成不可删除:`configurable: false`,此时就不可以删除
// console.log(Object.getOwnPropertyDescriptor(obj, 'a'));
// {
// configurable: true
// enumerable: true
// value: 1
// writable: false
// }
● 属于属性描述符的一种
let obj = {a: 1};
obj.a; // [[Get]]
obj.a = 3; // [[Put]]赋值操作;
/**
1. 先查找:getter、setter操作
2. 查看属性描述符writable是否可写
3. 赋值
*/
var obj = {
log: ['apple', 'orange'],
get latest() { // 伪属性 get
if(this.log.length === 0) {
return undefined;
}
return this.log[this.log.length - 1];
}
}
console.log(obj.latest); // orange
console.log(obj.log.length); // 2
var obj = {
get a() {
return 2;
}
}
Object.defineProperty(obj, 'b', {
get: function() {
return this.a * 3;
},
});
console.log(obj.a); // 2
console.log(obj.b); // 6
Object.defineProperty
定义的属性值由get来设置的时候,不可以设置他的属性描述符:value、writable,其余两个是可以使用的Object.defineProperty(obj, 'b', {
get: function() {
return this.a * 3;
},
value: 3, // 报错
writable: true, // 报错,false也一样
});
var language = {
set current(name) {
this.log.push(name);
},
log: []
}
language.current = 'en';
language.current = 'ch';
console.log(language.log); // [ 'en', 'ch' ]
var obj = {
get a() {
return this._a;
},
set a(val) {
this._a = val * 2;
}
}
obj.a = 10;
console.log(obj.a); // 20