const game = { name: 'Fornite', developer: 'Epic Games' };
console.log(game.name)
const developerKey = { toString(){ return 'developer' } } console.log(game[developerKey]); //Epic Games
console.log(game.toString); //ƒ toString() { [native code] } console.log(game.toLocaleString); //ƒ toLocaleString() { [native code] }
const obj = {}; console.log(obj.toString); //ƒ toString() { [native code] } delete obj.toString console.log(obj.toString); //ƒ toString() { [native code] }
const obj = Object.create(null); console.log(obj.__proto__ === undefined); //true 8. 类是原型系统之上的糖语法 class 关键字创造了一种基于类的语言的错觉,但事实并非如此。 JavaScript 中的类只是原型系统上的一种糖语法。
9.对象可以存储其他对象 属性的值可以是任何类型。属性可以存储对象。考虑下一个例子,其中 developer 是一个对象而不是一个字符串。 const game = { name : 'Fornite', developer: { name: 'Epic Games', founder: 'Tim Sweeney' } }; 10.对象可以存储功能 属性值可以是任何类型,包括函数。 以下对象具有存储函数的 toString 属性。
当函数存储在对象上时,它可以用作方法。请注意,在方法中,我们可以使用 this 关键字来访问关联对象的属性。 11.物体可以被冻结 默认情况下,对象是动态的,这意味着我们可以在创建后添加、编辑或删除它们的属性。 尽管如此,我们可以使用 Object.freeze() 实用程序在创建时冻结这样的对象。之后,我们无法添加、编辑或删除其中的属性。 查看下一个冻结的对象。 const game = Object.freeze({ name: 'Fornite', }); //game.developer = 'Epic Games'; //Cannot add property developer, object is not extensible game.name = 'Valorant'; //Cannot assign to read only property 'name' of object 12.原型可以冻结 原型也可以冻结。 当原型被冻结时,从它继承的对象不能具有同名的新属性。考虑以下冻结原型。
因为原型被冻结并且具有 toString 属性,我们不能在从它继承的新对象上定义具有相同名称的属性。 const game = Object.create(prototype); game.name = 'Fornite'; game.toString = function (){ return `Game: ${this.name}`; }; //Cannot assign to read only property 'toString' of object 13. Object.keys、Object.values 和 Object.entries 帮助检索拥有的键和值 对象有两种属性,拥有的属性是在对象本身上定义的。例如 name 和 developer 是我们游戏对象的所有属性。继承的属性是来自原型的属性。例如,toString 是所有对象的继承属性。 我们可以使用 Object.keys() 实用程序获取对象的所有拥有键。
以类似的方式,我们可以使用 Object.values() 获取所有值。 console.log(Object.values(game)); //['Fornite', 'Epi Games'] Object.entries() 检索包含所有拥有的 [key, value] 对的数组。
Object.keys、Object.values 和 Object.entries 都返回一个数组。一旦我们有了它,我们就可以开始使用数组方法了。 14. 使用对象模拟数组 是的,数组是使用对象模拟的。考虑以下数组。 const games = [ {name: 'Candy Crush', developer: 'King'}, {name: 'Angry Birds', developer: ' Rovio Entertainment'} ]; 它使用类似于下面的对象进行模拟。
这就是为什么我们可以使用数字索引和字符串来访问相同的元素。请记住,非字符串键被转换为字符串,因此,数组索引被转换为字符串。 console.log(games[1] === games['1']); //true 15. 对象是哈希映射 JavaScript 中的对象类似于其他语言中称为映射或哈希表的对象,密钥的访问时间为 O(1)。
这就是为什么你可能会看到对象用作映射来搜索唯一键。
我们现在可以使用 gamesMap 地图在恒定时间 O(1) 内通过 id 获取游戏对象,而无需遍历列表。 总结 |
|