详解js创建对象的几种方式和对象方法


Posted in Javascript onMarch 01, 2021

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

创建对象的几种模式:

工厂模式:

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

function getObj(name, age) {
  let obj = {}
  obj.name = name
  obj.age = age
  return obj
 }
 let person1 = getObj("cc", 31)

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

构造函数模式:

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

function CreateObj(name, age) {
  this.name = name
  this.age = age
 }
 let person1 = new CreateObj("cc", 31)
 console.log(person1)
 console.log(person1.constructor === CreateObj); // true
 console.log(person1 instanceof CreateObj); // true

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

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

function CreateObj(name, age) {
  this.name = name
  this.age = age
 }
 CreateObj('cc', 10)
 console.log(window.name) // 'cc'

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

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

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

function sayName() {
  console.log(this.name)
 }
 function CreatePerson(name, age) {
  this.name = name
  this.age = age
  this.sayName = sayName
 }
 let person1 = new CreatePerson('joy', 31)
 person1.sayName()

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

原型模式:

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

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

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

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

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

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

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

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

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

访问对象的属性的方法:

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

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

function Person() {}
 Person.prototype.name = "cc"
 let person = new Person()
 person.age = 21
 let sy = Symbol('sy')
 person[sy] = 'smile'
 console.log(Object.values(person)) // [ 21 ]
 console.log(Object.entries(person)) // [ [ 'age', 21 ] ]

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

Javascript 相关文章推荐
不错的JS中变量相关的细节分析
Aug 13 Javascript
javascript 控制 html元素 显示/隐藏实现代码
Sep 01 Javascript
16个最流行的JavaScript框架[推荐]
May 29 Javascript
下拉列表选择项的选中在不同浏览器中的兼容性问题探讨
Sep 18 Javascript
jquery 取子节点及当前节点属性值的方法
Aug 24 Javascript
JavaScript中的关联数组问题
Mar 04 Javascript
jQuery Tree Multiselect使用详解
May 02 jQuery
详解10分钟学会vue滚动行为
Sep 21 Javascript
详解Require.js与Sea.js的区别
Aug 05 Javascript
JS中的防抖与节流及作用详解
Apr 01 Javascript
JavaScript实现简单拖拽效果
Sep 15 Javascript
js中Map和Set的用法及区别实例详解
Feb 15 Javascript
vue 使用饿了么UI仿写teambition的筛选功能
Mar 01 #Vue.js
vue实现拖拽进度条
Mar 01 #Vue.js
vue 使用 v-model 双向绑定父子组件的值遇见的问题及解决方案
Mar 01 #Vue.js
js闭包和垃圾回收机制示例详解
Mar 01 #Javascript
vue前端和Django后端如何查询一定时间段内的数据
Feb 28 #Vue.js
vue-router路由懒加载及实现的3种方式
Feb 28 #Vue.js
vue-router懒加载的3种方式汇总
Feb 28 #Vue.js
You might like
php执行sql语句的写法
2009/03/10 PHP
PHP中数组的三种排序方法分享
2012/05/07 PHP
php通过ksort()函数给关联数组按照键排序的方法
2015/03/18 PHP
ThinkPHP数据操作方法总结
2015/09/28 PHP
通过PHP简单实例介绍文件上传
2015/12/16 PHP
thinkPHP5.0框架简单配置作用域的方法
2017/03/17 PHP
PHP智能识别收货地址信息实例
2019/01/05 PHP
js 内存释放问题
2010/04/25 Javascript
Nodejs极简入门教程(一):模块机制
2014/10/25 NodeJs
jquery中show()、hide()和toggle()用法实例
2015/01/15 Javascript
js数组常见操作及数组与字符串相互转化实例详解
2015/11/10 Javascript
javascript:void(0)是什么意思及href=#与href=javascriptvoid(0)的区别
2015/11/13 Javascript
JS控制伪元素的方法汇总
2016/04/06 Javascript
原生js仿jquery animate动画效果
2016/07/13 Javascript
js倒计时简单实现代码
2016/08/11 Javascript
vue v-model表单控件绑定详解
2017/05/17 Javascript
webpack 处理CSS资源的实现
2019/09/27 Javascript
python下paramiko模块实现ssh连接登录Linux服务器
2015/06/03 Python
Python选课系统开发程序
2016/09/02 Python
老生常谈python之鸭子类和多态
2017/06/13 Python
python3 flask实现文件上传功能
2020/03/20 Python
Python实现批量执行同目录下的py文件方法
2019/01/11 Python
Python generator生成器和yield表达式详解
2019/08/08 Python
Python使用百度api做人脸对比的方法
2019/08/28 Python
Python流程控制常用工具详解
2020/02/24 Python
Python捕获异常堆栈信息的几种方法(小结)
2020/05/18 Python
Python面向对象实现方法总结
2020/08/12 Python
html5 canvas 实现光线沿不规则路径运动
2020/04/20 HTML / CSS
德国宠物用品、宠物食品及水族馆网上商店:ZooRoyal
2017/07/09 全球购物
英国最大的在线照明商店:Litecraft
2020/08/31 全球购物
网游商务专员求职信
2013/10/15 职场文书
业务经理岗位职责
2013/11/11 职场文书
库房主管岗位职责
2013/12/31 职场文书
Python中字符串对象语法分享
2022/02/24 Python
方法汇总:Python 安装第三方库常用
2022/04/26 Python
解决Oracle数据库用户密码过期
2022/05/11 Oracle