详解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解密入门之凭直觉解
Jun 25 Javascript
jQuery Study Notes学习笔记 (二)
Aug 04 Javascript
一样的table?不一样的table(可编辑状态table)
Sep 19 Javascript
jQuery学习笔记(1)--用jQuery实现异步通信(用json传值)具体思路
Apr 08 Javascript
JavaScript将数组转换成CSV格式的方法
Mar 19 Javascript
使用jquery实现仿百度自动补全特效
Jul 23 Javascript
jquery拖动层效果插件用法实例分析(附demo源码)
Apr 28 Javascript
Angular 4.X开发实践中的踩坑小结
Jul 04 Javascript
BootStrap数据表格实例代码
Sep 13 Javascript
ES6 如何改变JS内置行为的代理与反射
Feb 11 Javascript
解决vue项目router切换太慢问题
Jul 19 Javascript
vue实现书本翻页动画效果实例详解
Apr 08 Vue.js
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 中的批处理的实现
2007/06/14 PHP
php 过滤器实现代码
2010/08/09 PHP
Thinkphp开发--集成极光推送
2017/09/15 PHP
Thinkphp 5.0实现微信企业付款到零钱
2018/09/30 PHP
用PHP做了一个领取优惠券活动的示例代码
2019/07/05 PHP
JavaScript库 开发规则
2009/01/31 Javascript
JQuery的html(data)方法与<script>脚本块的解决方法
2010/03/09 Javascript
用Javascript评估用户输入密码的强度实现代码
2011/11/30 Javascript
深入分析js中的constructor和prototype
2012/04/07 Javascript
jquery的ajax()函数传值中文乱码解决方法介绍
2012/11/08 Javascript
jQuery实现图片放大预览实现原理及代码
2013/09/12 Javascript
什么是cookie?js手动创建和存储cookie
2014/05/27 Javascript
用js通过url传参把数据从一个页面传到另一个页面
2014/09/01 Javascript
JavaScript的代码编写格式规范指南
2015/12/07 Javascript
jquery实现删除一个元素后面的所有元素功能
2015/12/21 Javascript
jQuery版AJAX简易封装代码
2016/09/14 Javascript
jQuery Easyui datagrid editor为combobox时指定数据源实例
2016/12/19 Javascript
Vue源码解读之Component组件注册的实现
2018/08/24 Javascript
jQuery实现数字自动增加或者减少的动画效果示例
2018/12/11 jQuery
vue 自定义右键样式的实例代码
2019/11/06 Javascript
Vue状态模式实现窗口停靠功能(灵动、自由, 管理后台Admin界面)
2020/03/06 Javascript
使用 Python 获取 Linux 系统信息的代码
2014/07/13 Python
python中偏函数partial用法实例分析
2015/07/08 Python
python九九乘法表的实例
2017/09/26 Python
解决python打不开文件(文件不存在)的问题
2019/02/18 Python
详解python中init方法和随机数方法
2019/03/13 Python
详解python-图像处理(映射变换)
2019/03/22 Python
Django3.0 异步通信初体验(小结)
2019/12/04 Python
Python openpyxl模块原理及用法解析
2020/01/19 Python
keras 特征图可视化实例(中间层)
2020/01/24 Python
Python调用.net动态库实现过程解析
2020/06/05 Python
Android Q之气泡弹窗的实现示例
2020/06/23 Python
纯CSS3实现手风琴风格菜单具体步骤
2013/05/06 HTML / CSS
如何写自我鉴定
2014/03/19 职场文书
秋冬农业生产标语
2014/10/09 职场文书
中学总务处工作总结
2015/08/12 职场文书