经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » JS/JS库/框架 » JavaScript » 查看文章
详解js创建对象的几种方式和对象方法
来源:jb51  时间:2021/3/1 12:56:51  对本文有异议

这篇文章是看js红宝书第8章,记的关于对象的笔记(第二篇)。

创建对象的几种模式:

工厂模式:

工厂是函数的意思。工厂模式核心是定义一个返回全新对象的函数。

  1. function getObj(name, age) {
  2. let obj = {}
  3. obj.name = name
  4. obj.age = age
  5. return obj
  6. }
  7. let person1 = getObj("cc", 31)

缺点:不知道新创建的对象是什么类型

构造函数模式:

通过一个构造函数,得到一个对象实例。
构造函数和工厂模式区别是:
1,构造函数函数体加了this
2,构造函数没有return
3,构造函数调用时,用new关键字

  1. function CreateObj(name, age) {
  2. this.name = name
  3. this.age = age
  4. }
  5. let person1 = new CreateObj("cc", 31)
  6. console.log(person1)
  7. console.log(person1.constructor === CreateObj); // true
  8. console.log(person1 instanceof CreateObj); // true

关于构造函数的两个问题:

1,构造函数和普通函数唯一区别是调用方式。构造函数要用new关键字。如果不用new,则是往Global对象上加属性。下面例子中,CreateObj方法,往window对象上加了name和age属性

  1. function CreateObj(name, age) {
  2. this.name = name
  3. this.age = age
  4. }
  5. CreateObj('cc', 10)
  6. console.log(window.name) // 'cc'

2,构造函数存在的问题: 构造函数体内的方法,每次创建一个实例,都会创建一遍。

  1. person1.sayName( ) === person2.sayName( ) // false

解决方法是,将sayName定义在createObj外面。

  1. function sayName() {
  2. console.log(this.name)
  3. }
  4. function CreatePerson(name, age) {
  5. this.name = name
  6. this.age = age
  7. this.sayName = sayName
  8. }
  9. let person1 = new CreatePerson('joy', 31)
  10. person1.sayName()

但是,这样会让自定义类型引用的代码不能很好聚在一起。

原型模式:

原理是,每个函数都有一个prototype属性。prototype是一个对象,里面定义的属性和方法会被所有实例共享。
关于原型模式,有两个等式:

  1. function Person() { }
  2. let person1 = new Person()
  3. console.log(person1.__proto__ === Person.prototype) // true
  4. console.log(Person.prototype.constructor === Person); // true

关于原型对象的三个方法:isPrototype , getPrototypeof,setPrototypeOf, Object.create()

  1. // isPrototypeOf判断构造函数的原型对象是否是实例的原型对象
  2. function Person() {}
  3. let person1 = new Person()
  4. console.log(Person.prototype.isPrototypeOf(person1)); // true
  1. // 获取对象的原型对象
  2. function Person() {}
  3. let person1 = new Person()
  4. console.log(Object.getPrototypeOf(person1) === Person.prototype);
  1. // 将某个对象,设为另一个对象的原型对象
  2. let person1 = {name: "cc"}
  3. let person2 = {age: 32}
  4. Object.setPrototypeOf(person1,person2)
  5. console.log(person1.name, person1.age); // cc 32
  1. // 以某个对象为原型对象,创建一个新对象
  2. let person1 = {name: "cc"}
  3. let person2 = Object.create(person1)
  4. person2.age = 30
  5. console.log(person2.name, person2.age);

当访问一个对象person的name属性时,是按照以下步骤去访问:
1,person上如果有name属性(即便这个属性是null,也会返回null),返回name属性值;没有,继续去原型对象Person.prototype上找
2,如果原型上有name属性,返回原型上name属性值;没有,则返回undefined

判断一个属性是在实例上,还是在原型上,可以用hasOwnProperty

  1. function Person() {}
  2. Person.prototype.name = "cc"
  3. let person1 = new Person()
  4. console.log(person1.name) // 'cc'
  5. console.log(person1.hasOwnProperty("name")); // false

判断一个对象上是否有个某个属性,用in操作符

  1. // 对象自身 or 原型上找到,都返回true
  2. function Person() {}
  3. Person.prototype.name = "cc"
  4. let person1 = new Person()
  5. console.log("name" in person1) // true
  6. console.log(person1.hasOwnProperty("name")); // false

访问对象的属性的方法:

  1. Object.keys( )
  2. for ... in // 继承属性也会遍历出来
  3. Object.getOwnPropertyNames(obj) // 会列出可枚举和不可枚举属性,其他和 Object.keys( )结果一样
  4. Object.getOwnPropertySymbols(obj) // 和getOwnPropertyNames类似,只是仅针对symbol
  5. Reflect.ownKeys(obj) // 和Object.keys( )结果一样

其他访问对象属性和属性值的方法:
Object.values( ) 对象值组成的数组,会省掉Symbol型。
Object.entries( ) 对象键值对组成的数组,会将键,转化成字符串,省掉Symbol型。

  1. function Person() {}
  2. Person.prototype.name = "cc"
  3. let person = new Person()
  4. person.age = 21
  5. let sy = Symbol('sy')
  6. person[sy] = 'smile'
  7. console.log(Object.values(person)) // [ 21 ]
  8. console.log(Object.entries(person)) // [ [ 'age', 21 ] ]

到此这篇关于详解js创建对象的几种方式和对象方法的文章就介绍到这了,更多相关js创建对象内容请搜索w3xue以前的文章或继续浏览下面的相关文章希望大家以后多多支持w3xue!

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号