创建: 2019/02/19
迁入: 2019/02/19 从【JavaScript 基础】迁入 Object相关内容
完成: 2019/02/26 (并给迁入专门赋予新的标签: 迁入)
更新: 2019/02/26 已完全覆盖迁入内容, 故删除迁入内容, 移到删除
更新: 2019/03/03 补充class语法
更新: 2019/05/03 补充class内部定义属性
待完成事项: TODO
Object的生成 | |||||||||||||||||||||||||||||||||||||||||||||||
注意 |
|
||||||||||||||||||||||||||||||||||||||||||||||
class语法 |
class A { constructor() { this.a = 1; } show() { console.log(`this.a = ${this.a}`); } } let a = new A(); 注: · constructor是构造函数, 相当于 function A() {} 定义属性和方法都可以在 constructor() {...} 外 class Sample { a = 1; // 属性都在this里 b = {a: 1, b: 2}; show() { // 方法都在this.prototype里 console.log(`a: ${this.a}, b: ${this.b}`); }; } · 除了constructor以外的属性, 如果是方法则自动放入prototype, 其他相当于constructor里设置 · class声明不上卷, 遇到以后才能用 · 同一个名称只能用一次, let a = class name {...} 除外(这种的name只在类定义内部有效) · 类的constructor不能当做函数来用 · 定义访问属性: class C { show() { console.log(`name: ${this.name}`); } get name() { return this.a; } set name(v) { this.a = v.toString(); } } · 类方法用static · 继承用extends 子类的构造函数要先呼出 super() |
||||||||||||||||||||||||||||||||||||||||||||||
对象字符(literal)生成 |
{键: 值, 键: 值, ...} var sample = { a: 1, b: 2, "c":3}; var multi = { {a: 1, b: 2}, c: 1, d: 2 }; 获取: sample.a或sample["a"] |
||||||||||||||||||||||||||||||||||||||||||||||
构析函数 |
构析函数来生成 function Object-Name(args) { this.property-name = ?; this.property-name = ?; ... } var sample = new Object-Name(args);
例: function ObjectTest(numA, numB) { this.numA = numA; this.numB = numB; } let objectTest = new ObjectTest(111, 222);
生成带方法的Object: function Sum(a, b) { this.a = a; this.b = b; this.sum = function() { return a + b; } } var sample = new Sum(1, 2); console.log(sample.sum()); // 3
|
||||||||||||||||||||||||||||||||||||||||||||||
Object.create |
var o3 = Object.create(Object.prototype, { a: { value: 1, // 必须有 writable: true, // 必须有 enumerable: true, // 必须有 configurable: true // 必须有 }, b: { value: 1, writable: true, enumerable: true, configurable: true } }); 注: 每一个属性都要设定 value, writable, enumerable, configurable
|
||||||||||||||||||||||||||||||||||||||||||||||
用构析函数定义函数的问题 |
每一个实例都生成共有的元素函数,占用内存空间 注: prototype默认为{}, 啥都没有 从instance处只可读
|
||||||||||||||||||||||||||||||||||||||||||||||
访问与添加属性 | |||||||||||||||||||||||||||||||||||||||||||||||
获取属性 |
var sample = {a: 1, b: 2} 不存在时返回undefined
|
||||||||||||||||||||||||||||||||||||||||||||||
增加与删除元素 |
|
||||||||||||||||||||||||||||||||||||||||||||||
内置Object | 传送门:http://www.cnblogs.com/lancgg/p/8281719.html | ||||||||||||||||||||||||||||||||||||||||||||||
protype的继承 | |||||||||||||||||||||||||||||||||||||||||||||||
__proto__ |
小结: __proto__是从头到目前object的所有继承内容, prototype是此object添加的。 继承此object的__proto__ = 上一个.prototype |
||||||||||||||||||||||||||||||||||||||||||||||
new的作用 |
例 // new的作用 function Sample(a, b) { this.a = a; this.b = b; } Sample.prototype.show = function () { console.log(this.a + this.b); } var o9 = new Sample(10, 30); 内部处理
|
||||||||||||||||||||||||||||||||||||||||||||||
prototype的属性 |
构造函数(所有函数都是)的prototype自带属性
function F() {}; console.log(F.prototype.constructor); // ƒ F() {} console.log(F.prototype.__proto__); // Object.prototype
|
||||||||||||||||||||||||||||||||||||||||||||||
确认proto |
instanceof a instanceof A // 对象 instanceof 构造函数 function F() {}; var obj = new F(); console.log(obj instanceof F); // true console.log(obj instanceof Object); // true console.log(obj instanceof Date); // false
isPrototypeOf prototype.isPrototypeOf(对象); function F() {}; var obj = new F(); console.log(F.prototype.isPrototypeOf(obj)); // true console.log(Object.prototype.isPrototypeOf(obj)); // true console.log(Date.prototype.isPrototypeOf(obj)); // false
|
||||||||||||||||||||||||||||||||||||||||||||||
Object的constructor |
// 三个完全等价 var obj = {}; var obj = Object(); var obj = new Object(); 若指定参数, 则转换为对应的对象
|
||||||||||||||||||||||||||||||||||||||||||||||
Object.prototype |
所有自带Object都继承,instance上都可用
|
||||||||||||||||||||||||||||||||||||||||||||||
访问属性 | |||||||||||||||||||||||||||||||||||||||||||||||
属性种类 | 数据属性, 访问属性 | ||||||||||||||||||||||||||||||||||||||||||||||
访问属性 |
● 用get, set替代 function ● get, set中间要逗号 ● get没参数, set一个参数 ● 呼出不存在的setter不会有反应, strict模式下报错 注: 内置属性(Object.prototype等)的都是 writable: true, enumerable: false, configurable: true get 函数名() {
...
}
set 函数名(一个参数名) {
...
}
var a = { _t: 't', get t() { return this._t; }, // 要逗号 set t(v) { this._t = this._t + '|' + v; } } console.log(a.t); // t a.t = 100; console.log(a.t); // t|100
|
||||||||||||||||||||||||||||||||||||||||||||||
对外部隐藏数据属性 |
用闭包 var b = (function () { var a = "a"; return { show: function () { console.log('name: ' + a); }, get name() { return a; }, set name(v) { a = v; } }; })(); b.show(); // => name: a b.name = "haha"; b.show(); // => name: haha
|
||||||||||||||||||||||||||||||||||||||||||||||
property的属性 | |||||||||||||||||||||||||||||||||||||||||||||||
两种 |
|
||||||||||||||||||||||||||||||||||||||||||||||
属性的属性 |
[getter/setter]和[value+write]不可共存
|
||||||||||||||||||||||||||||||||||||||||||||||
属性描述符 |
属性描述符 { value: 属性值, writable: true/false, enumerable: true/false, configurable: true/ false, }
|
||||||||||||||||||||||||||||||||||||||||||||||
属性的枚举 | |||||||||||||||||||||||||||||||||||||||||||||||
for/in |
语言自带的内置属性(Object.prototype等内部的)的 enumerable都是false · 有些库对Object.prototype添加方法时enumerable没设为false, 避免误操作的方法 for (var p in obj) { if (!obj.hasOwnProperty(p)) { continue; } ... } // 或者 for (var p in obj) { if (typeof(p) === "function") { continue; } ... }
|
||||||||||||||||||||||||||||||||||||||||||||||
Object.keys |
只返回此类定义且可枚举的 |
||||||||||||||||||||||||||||||||||||||||||||||
Object.getOwnPropertyNames |
只返回此类定义的所有属性/方法(无视enumerable是否为true)
|
||||||||||||||||||||||||||||||||||||||||||||||
Object的锁 | |||||||||||||||||||||||||||||||||||||||||||||||
extensible |
是否可以新添加属性 内置object和所有自定义object的默认都是true |
||||||||||||||||||||||||||||||||||||||||||||||
阻止扩展 |
Object.preventExtensions(obj)
strict模式下阻止后再添加会报错 |
||||||||||||||||||||||||||||||||||||||||||||||
保护 |
Object.seal(obj)
禁止 添加/删除 新 属性/方法, 且所有的configurable设为false 即只可以改变属性的值 |
||||||||||||||||||||||||||||||||||||||||||||||
冻结 |
Object.freeze(obj)
禁止一切操作, 除了读取(有setter的可以调用setter来改变属性) |
||||||||||||||||||||||||||||||||||||||||||||||
Mixin | |||||||||||||||||||||||||||||||||||||||||||||||
不继承, 把属性复制到其他object | |||||||||||||||||||||||||||||||||||||||||||||||
Object.assign(target [, ...]) |
把第二参数及以后的所有自定义变量都写入target 注: 只是增加一个参照, 直接呼出值. 不兼容访问属性 解决方法: Object.getOwnPropertyDescriptor(obj, key), Object.defineProperty function mixin(to, from) { for (var p in from) { if (from.hasOwnProperty(p)) { Object.defineProperty(to, p, Object.getOwnPropertyDescriptor(from, p)); } } return to; }
|
||||||||||||||||||||||||||||||||||||||||||||||
JSON | |||||||||||||||||||||||||||||||||||||||||||||||
写法 |
'{ "a": 1 }' // 最外边有单引号, 所有字符串和属性名都要加双引号
|
||||||||||||||||||||||||||||||||||||||||||||||
object与json的转换 |
|
||||||||||||||||||||||||||||||||||||||||||||||
ES6的相关扩张 | |||||||||||||||||||||||||||||||||||||||||||||||
动态生成属性名 |
{ [式子]: value }
若式子是Symbol则直接用, 否则转换为字符串 例: let o3 = { [100+1*23+23/18]: 1 } console.log(o3); // => {124.27777777777777: 1}
|
||||||||||||||||||||||||||||||||||||||||||||||
属性定义的简写 |
{ prop } // 属性名是变量名, 属性值是变量值 例: let kkk = o3; let o4 = { a: 1, o3, kkk, b: 2 }; console.log(o4); // => {a: 1, o3: {…}, kkk: {…}, b: 2}
|
||||||||||||||||||||||||||||||||||||||||||||||
方法定义的简写 |
{ method() {} } 例: let o5 = {
show(name) { console.log(`the name is: ${name}`); }
}
和 函数名: function () {} 的区别 · 不能作为构造函数来用(没有prototype属性, 无法用new生成实例) · 内部可以用 super |
||||||||||||||||||||||||||||||||||||||||||||||
generator的简写 |
{ * generator() {} }
# TODO: 完成这里 |
||||||||||||||||||||||||||||||||||||||||||||||