对象补充-原型和函数原型-创建对象

defineProperties可以定义多个属性描述符

var obj = {// 私有属性(js里面是没有严格意义的私有属性)_age: 18,_eat: function() {}
}Object.defineProperties(obj, {name: {configurable: true,enumerable: true,writable: true,value: "why"},age: {configurable: false,enumerable: false,get: function () {return this._age},set: function (value) {this._age = value}}
})
console.log(obj)
// 

对象方法补充

1、获取对象的属性描述符

  • getOwnPropertyDescriptor
  • getOwnPropertyDescriptors
var obj = {// 私有属性(js里面是没有严格意义的私有属性)_age: 18,_eat: function() {}
}Object.defineProperties(obj, {name: {configurable: true,enumerable: true,writable: true,value: "why"},age: {configurable: false,enumerable: false,get: function () {return this._age},set: function (value) {this._age = value}}
})
// 获取某一个特定属性的属性描述符
console.log(Object.getOwnPropertyDescriptor(obj,'name'))
// 获取对象的所有属性描述符
console.log(Object.getOwnPropertyDescriptors(obj))

执行结果:

2、禁止对象扩展新属性:preventExtensions

3、禁止对象配置/删除里的属性

var obj = {name: 'why',age: 8
}// 禁止对象继续添加新的属性
Object.preventExtensions(obj)obj.height = 1.88
obj.address = "成都市"console.log(obj)Object.seal(obj)delete obj.nameconsole.log(obj)

分别不注释Object.seal(obj)和注释Object.seal(obj)的结果

 4、让属性不可以修改

var obj = {name: 'why',age: 8
}// 让属性不可以修改(writable:false)
Object.freeze(obj)obj.name = 'kobe'
console.log(obj.name)

执行结果

创建多个对象的方案

工厂模式

  1. 工厂模式其实是一种常见的设计模式
  2. 通常我们会有一个工厂方法,通过该工厂方法我们可以产生想要的对象
// 工厂模式: 工厂函数
function createPerson(name, age, height, address) {var p = {}p.name = namep.age = agep.height = heightp.address = addressp.eating = function () {console.log(this.name + "在吃东西~")},p.running = function () {console.log(this.name + "在跑步!")}return p
}var p1 = createPerson('张三', 18, 1.78, '北京市')
var p2 = createPerson('李四', 23, 1.88, '成都市')
var p3 = createPerson('王麻子', 28, 1.98, '重庆市')// 工厂模式的缺点(获取不到对象最真实的类型)
console.log(p1, p2, p3)

构造函数

// 构造函数
function person(name, age, height, address) {this.name = namethis.age = agethis.height = heightthis.address = addressthis.eating = function () {console.log(this.name + "在吃东西~")},this.running = function () {console.log(this.name + "在跑步!")}
}var p1 = new person('张三', 18, 1.78, '北京市')
console.log(p1)

规范:构造函数的首字母一般是大写

原型的概念

// 我们每一个对象都有一个[[prototype]],这个属性可以称之为对象的原型(隐式原型)var obj = { name: 'why'}  // [[prototype]]
var info = {}  // [[prototype]]// 1、解释原型的概念和看一下原型
// 早期的ECMA是没有规范如何查看[[prototype]]// 给对象中提供了一个属性,可以让我们查看一下这个原型对象(浏览器提供)
// __proto__// console.log(obj.__proto__)
// console.log(info.__proto__)var obj = { name: 'why', __proto__: {}}// ES5之后提供的Object.getPrototypeOf// console.log(Object.getPrototypeOf(obj))// 2、原型有什么用
// 当我们从一个对象中获取某一个属性时,它会触发[[get]]操作
// 1、在当前对象中去查找对应的属性,如果找到就直接使用
// 2、如果没有找到,那么会沿着它的原型去查找[[prototype]]
// obj.age = 18
obj.__proto__.age = 18console.log(obj.age)

Person构造函数原型内存图

函数原型上的属性-constructor

赋值为新的对象

function foo() {}// foo.prototype这个对象中有一个constructor的属性
// console.log(foo.prototype)
// console.log(Object.getOwnPropertyDescriptor(foo.prototype))// Object.defineProperty(foo.prototype, 'constructor', {
//     enumerable: true,
//     configurable: true,
//     writable: true,
//     value: "哈哈哈哈"
// })// console.log(foo.prototype)// prototype.constructor = 构造函数本身// console.log(foo.prototype.constructor)  // [Function: foo]
// console.log(foo.prototype.constructor.name)// console.log(foo.prototype.constructor.prototype.constructor.prototype.constructor)// 2. 我们也可以添加自己的属性
// foo.prototype.name = "why"
// foo.prototype.age = 18
// foo.prototype.height = 180
// foo.prototype.eating = function () {// }// var f1 = new foo()
// console.log(f1.name, f1.age)// 3.直接修改整个prototype
foo.prototype =  {// constructor: foo,name: "why",age: 18,height: 180
}var f1 = new foo()
console.log(f1.name, f1.age, f1.height)// 真实开发中我们通过Object.defineProperty方式添加constructor
Object.defineProperty(foo.prototype, 'constructor', {enumerable: true,configurable: true,writable: true,value: foo
})

创建对象方案-原型和构造函数

function Person(name, age, height, address) {this.name = namethis.age = agethis.height = heightthis.address = address
}Person.prototype.eating = function() {console.log(this.name + "在吃东西~")
}Person.prototype.running = function() {console.log(this.name + "在跑步~")
}var p1 = new Person('why', 18, 1.88, '北京市')
var p2 = new Person('kobe', 20, 1.98, '洛杉矶市')p1.eating()
p2.running()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/154654.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JVM与Java体系结构

目录 一、Java虚拟机整体架构祥图 二、Java代码执行过程详图 三、汇编语言、机器语言、高级语言关系 四、JVM的架构模型 五、JVM的生命周期 (一)虚拟机的启动 (二)虚拟机的执行 (三)虚拟机的退出 …

API安全之《大话:API的前世今生》

写在前面:本文结合API使用的业界现状,系统性地阐述API的基本概念、发展历史、表现形式等基础内容,主要包含以下内容: 1.什么是API 2.API的发展历史 3.现代API常用消息格式 4.top N 互联网企业API 使用现状 当前的世界是一个信…

STM32单片机智能小车一PWM方式实现小车调速和转向

目录 1. 电机模块开发 2. 让小车动起来 3. 串口控制小车方向 4. 如何进行小车PWM调速 5. PWM方式实现小车转向 1. 电机模块开发 L9110s概述 接通VCC,GND 模块电源指示灯亮, 以下资料来源官方,具体根据实际调试 IA1输入高电平&#xff…

Mac删除照片快捷键ctrl加什么 Mac电脑如何批量删除照片

Mac电脑是很多人喜欢使用的电脑,它有着优美的设计、高效的性能和丰富的功能。如果你的Mac电脑上存储了很多不需要的照片,那么你可能会想要删除它们,以节省空间和提高速度。那么,Mac删除照片快捷键ctrl加什么呢?Mac电脑…

Python爬虫实战(六)——使用代理IP批量下载高清小姐姐图片(附上完整源码)

文章目录 一、爬取目标二、实现效果三、准备工作四、代理IP4.1 代理IP是什么?4.2 代理IP的好处?4.3 获取代理IP4.4 Python获取代理IP 五、代理实战5.1 导入模块5.2 设置翻页5.3 获取图片链接5.4 下载图片5.5 调用主函数5.6 完整源码5.7 免费代理不够用怎…

【2021ICPC沈阳】EFBJHL

不知道为什么感觉以前的场要比现在的简单一点,虽然这场VP虽然题数到了但是还是差点罚时.... 现在的有些场感觉连签到都要签半天,比如前几天的ICPC西安和CCPC桂林,看了下题都不简单 这场甚至银牌题都没什么思维,只需要算法的板子…

【OpenCV实现图像找到轮廓的不同特征,就像面积,周长,质心,边界框等等。】

文章目录 概要图像矩凸包边界矩形 概要 OpenCV是一个流行的计算机视觉库,它提供了许多图像处理和分析功能,其中包括查找图像中物体的轮廓。通过查找轮廓,可以提取许多有用的特征,如面积、周长、质心、边界框等。 以下是几种使用…

【3D 图像分割】基于 Pytorch 的 VNet 3D 图像分割7(数据预处理)

在上一节:【3D 图像分割】基于 Pytorch 的 VNet 3D 图像分割6(数据预处理) 中,我们已经得到了与mhd图像同seriesUID名称的mask nrrd数据文件了,可以说是一一对应了。 并且,mask的文件,还根据结…

FANUC机器人PRIO-621和PRIO-622设备和控制器没有运行故障处理

FANUC机器人PRIO-621和PRIO-622设备和控制器没有运行故障处理 如下图所示,新的机器人开机后提示报警: PRIO-621 设备没有运行 PRIO-622 控制器没有运行 我们首先查看下手册上的报警代码说明,如下图所示, 如下图所示&#xff0c…

DSP 开发例程(5): tcp_server

目录 DSP 开发例程(5): tcp_server创建工程源码编辑tcp_echo.chelloWorld.c 调试说明 DSP 开发例程(5): tcp_server 此例程实现在 EVM6678L 开发板上创建 TCP Server进程, 完成计算机与开发板之间的 TCP/IP 通信. 例程源码可从我的 gitee 仓库上克隆或下载. 点击 DSP 开发教程…

IDEA MyBatisX插件介绍

一、前言 前几年写代码的时候,要一键生成DAO、XML、Entity基础代码会采用第三方工具,比如mybatis-generator-gui等,现在IDEA或Eclipse都有对应的插件,像IDEA中MyBatisX就是一个比较好用的插件。 二、MyBatisX安装配置使用 MyBa…

【UE 模型描边】UE5中给模型描边 数字孪生 智慧城市领域 提供资源下载

目录 0 引言1 Soft Outlines1.1 虚幻商城1.2 使用步骤 2 Auto Mesh Outlines2.1 虚幻商城2.2 使用步骤 3 Survivor Vision3.1 虚幻商城3.2 使用步骤 结尾 🙋‍♂️ 作者:海码007📜 专栏:UE虚幻引擎专栏💥 标题&#xf…