重学js系列——对象

1,309 阅读3分钟

对象

本“大家”上周坐火车回老家,同行的是搞java的老弟,两个程序猴在一起能干嘛?(😀 别多想,本文讲的虽是对象,但我俩不搞对象,虽是基友,但我俩不搞基😅,哈哈),路上不自觉的讨论交流日常遇到的问题,在交流过程中发现java和js数据结构的不同之处,本文将对数据结构中的对象进行细节的探讨和总结。ok,接下请听我来一波讲解(装逼🙃)

js对象

javascript是基于原型的语言,对象是JavaScript的基本数据类型。对象是一种复合值,key/value(键值对)的形式,属性名是字符串,这种基本数据结构还有很多叫法:“散列表”(hashtable)、“字典”(dictionary)、“关联数组”(associative array)。
对象不仅仅是字符串到值的映射,除了可以保持自有的属性,还可以从一个称为原型的对象继承属性。

js创建对象

1.对象直接量

var obj = {} // 无属性对象
var obj1 = { name: 'ipenman' } // 属性name 值 ipenman

我们来看下,对象直接量创建的对象

image.png

上图可以看到:字面量创建的对象包含属性和是原型(proto),它的原型是Object的原型。

2.通过new + 构造函数创建

new Object()

var obj = new Object()


image.png


可以看出,new Object() 与 {} 效果一致,其原型就是Object的原型。

new 函数

function Obj(){}
var obj = new Obj()

image.png

new Obj() 创建的原型是由Obj构造函数和Object原型组成。

3.Object.create()

es5 定义了名为Object.create()的方法,它创建新对象,其中第一个参数是这个对象的原型(proto),必填。可选。如果没有指定为 undefined,则是要添加到新创建对象的不可枚举(默认)属性(即其自身定义的属性,而不是其原型链上的枚举属性)对象的属性描述符以及相应的属性名称。这些属性对应Object.defineProperties()的第二个参数。

eg1:Object.create(null)

var obj = Object.create(null)

image.png

eg2:Object.create({})

var obj = Object.create({})

image.png

var obj = Object.create({name:'ipenman'})

image.png

eg3:Object.create(prototype)
**

var obj = Object.create(Object.prototype)

image.png

function Person(){
	this.name = 'ipenman'
}
var obj = Object.create(Person.prototype)

image.png

{} 等价于  new Object() 等价于 Object.create(Object.prototype)
**

原型 vs 原型属性

原型与原型链请看本“大家”的github,文章是过去好久了,接下来的文章会重新更新,最后:star

访问原型

var obj = {}
console.log(Object.getPrototypeOf(obj))

访问原型属性

function obj(){}
obj.prototype.name = 'ipenman'
console.log(Object.prototype) // ipenman

继承

此部分,会单独拎出来一篇来讲,待更新补充链接。点这里
**

访问与设置

访问

访问js对象属性有两种方式:1.打**点(.) **2.方括号字符串 ([])。

var obj = {name:'ipenman'}
console.log(obj.name) // ipenman
console.log(obj["name"]) // ipenman

设置

设置与访问对应,打点或[]

var obj = {}
obj.name = 'ipenman'
obj["age"] = 24
console.log(obj) // obj { name:"ipenman", age:24 }

**

js对象 vs java对象


JavaScript:基于原型的语言。
java:基于OOP类面向对象的语言。
这么说来,js对象和java对象的区别实际是基于原型语言和基于类语言的区别。

基于类(Java)和基于原型(JavaScript)的对象系统的比较

基于类的(Java) 基于原型的(JavaScript)
类和实例是不同的事物。 所有对象均为实例。
通过类定义来定义类;通过构造器方法来实例化类。 通过构造器函数来定义和创建一组对象。
通过 new 操作符创建单个对象。 相同。
通过类定义来定义现存类的子类,从而构建对象的层级结构。 指定一个对象作为原型并且与构造函数一起构建对象的层级结构
遵循类链继承属性。 遵循原型链继承属性。
类定义指定类的所有实例的所有属性。无法在运行时动态添加属性。 构造器函数或原型指定初始的属性集。允许动态地向单个的对象或者整个对象集中添加或移除属性。

参考资源

《MDN-对象模型的细节》
《JavaScript权威指南》

最后

点赞加关注!😁