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

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.mzph.cn/news/124611.shtml

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

相关文章

Failed to prepare the device for development

👨🏻‍💻 热爱摄影的程序员 👨🏻‍🎨 喜欢编码的设计师 🧕🏻 擅长设计的剪辑师 🧑🏻‍🏫 一位高冷无情的编码爱好者 大家好,我是 DevO…

创新领航 | 竹云参编《基于区块链的数据资产评估实施指南》正式发布!

10月25日,由深圳数宝数据服务股份有限公司和深圳职业技术大学提出,中国科学院深圳先进技术研究院、中国电子技术标准化研究院、中国(天津)自由贸易试验区政策与产业创新发展局、网络空间治理与数字经济法治(长三角&…

论文阅读——ELECTRA

论文下载:https://openreview.net/pdf?idr1xMH1BtvB 另一篇分析文章:ELECTRA 详解 - 知乎 一、概述 对BERT的token mask 做了改进。结合了GAN生成对抗模型的思路,但是和GAN不同。 不是对选择的token直接用mask替代,而是替换为…

喜讯!合合信息顺利通过CMMI3级评估

近日,在擎标顾问团的咨询辅导下,上海合合信息科技股份有限公司(简称“合合信息”)顺利通过了CMMI3级评估。CMMI是国际上最流行、最实用的一种软件生产过程标准和软件企业成熟度等级认证的标准,通过该认证表明企业在开发…

【多线程面试题十四】、说一说synchronized的底层实现原理

文章底部有个人公众号:热爱技术的小郑。主要分享开发知识、学习资料、毕业设计指导等。有兴趣的可以关注一下。为何分享? 踩过的坑没必要让别人在再踩,自己复盘也能加深记忆。利己利人、所谓双赢。 面试官:说一说synchronized的底…

常见面试题-MySQL专栏(二)

了解索引扫描吗? 答: MySQL有两种方法生成有序结果: 通过排序操作按照索引顺序扫描 如果 explain 出来的 type 列值为 “index” 的话,说明是按照索引扫描了。 索引扫描本身的速度是很快的。但是如果索引不能覆盖查询所需的全…

Visual Studio Code的下载与安装

Visual Studio Code(简称 VS Code)是由 Microsoft 开发的免费、开源的文本编辑器,适用于多种操作系统,包括 Windows、macOS 和 Linux。它的设计目标是成为一款轻量级、高效的代码编辑工具,同时提供丰富的扩展和功能&am…

微软服务器数据库 Navicat Premium 连接

需要固定IP,在服务器的网络里面加上。 需要打开SSL,入下图 只用打开,不用选择秘钥,证书等

【c++|opencv】二、灰度变换和空间滤波---1.灰度变换、对数变换、伽马变换

every blog every motto: You can do more than you think. https://blog.csdn.net/weixin_39190382?typeblog 0. 前言 灰度变换、对数变换、伽马变换 1. 灰度变换 #include <iostream> #include <opencv2/opencv.hpp>using namespace std; using namespace c…

【C语言初学者周冲刺计划】1.1用筛选法求100之内的素数

目录 1解题思路&#xff1a; 2代码如下&#xff1a; 3运行代码如图所示&#xff1a; 4总结&#xff1a; (前言周冲刺计划:周一一个习题实操&#xff0c;依次类推加一&#xff0c;望各位读者可以独自实践敲代码) 1解题思路&#xff1a; 首先了解筛选法定义&#xff1a;先把…

色彩校正及OpenCV mcc模块介绍

一、术语 1.光&#xff1a;是电磁波&#xff0c;可见光是可被人眼感知的电磁波。可见光大约在400-700nm波段。光子携带的能量与波长成反比&#xff0c;400nm--700nm之间的单色光的颜色从紫色渐变成红色。 2.光谱&#xff1a;除了太阳光源外&#xff0c;LED灯、白炽灯等各种照明…

ThreadLocal 会出现内存泄漏吗?

ThreadLocal ThreadLocal 是一个用来解决线程安全性问题的工具。它相当于让每个线程都开辟一块内存空间&#xff0c;用来存储共享变量的副本。然后每个线程只需要访问和操作自己的共享变量副本即可&#xff0c;从而避免多线程竞争同一个共享资源。它的工作原理很简单&#xff0…

手机平板摄像头如何给电脑用来开视频会议

环境&#xff1a; Iriun Webcam EV虚拟摄像头 钉钉会议 问题描述&#xff1a; 手机平板摄像头如何给电脑用来开视频会议 解决方案&#xff1a; 1.下载软件 手机端和电脑端都下载这个软件&#xff0c;连接同一局域网打开软件连接好 另外一款软件Iriun 也是一样操作 2.打…

【图像分类】卷积神经网络之ResNet网络模型实现钢轨缺陷识别(附代码和数据集,PyTorch框架)

写在前面: 首先感谢兄弟们的关注和订阅,让我有创作的动力,在创作过程我会尽最大能力,保证作品的质量,如果有问题,可以私信我,让我们携手共进,共创辉煌。 本篇博文,我们将使用PyTorch深度学习框架搭建ResNet实现钢轨缺陷识别,附完整的项目代码和数据集,可以说是全网…

【Java笔试强训】Day7(WY22 Fibonacci数列、CM46 合法括号序列判断)

Fibonacci数列 链接&#xff1a;Fibonacci数列 题目&#xff1a; Fibonacci数列是这样定义的&#xff1a; F[0] 0 F[1] 1 for each i ≥ 2: F[i] F[i-1] F[i-2] 因此&#xff0c;Fibonacci数列就形如&#xff1a;0, 1, 1, 2, 3, 5, 8, 13, …&#xff0c;在Fibonacci数列…

UML—时序图是什么

目录 前言: 什么是时序图: 时序图的组成元素&#xff1a; 1. 角色(Actor) 2. 对象(Object) 3. 生命线(LifeLine) 4. 激活期(Activation) 5. 消息类型(Message) 6.组合片段(Combined fragment) 时序图的绘制规则:​ 绘制时序图的3步&#xff1a; 1.划清边界&#xf…

RabbitMQ消费者的可靠性

目录 一、消费者确认 二、失败重试机制 2.1、失败处理策略 三、业务幂等性 3.1、唯一消息ID 3.2、业务判断 3.3、兜底方案 一、消费者确认 RabbitMQ提供了消费者确认机制&#xff08;Consumer Acknowledgement&#xff09;。即&#xff1a;当消费者处理消息结束后&#x…

力扣刷题 day60:10-30

1.Excel表列名称 给你一个整数 columnNumber &#xff0c;返回它在 Excel 表中相对应的列名称。 例如&#xff1a; A -> 1 B -> 2 C -> 3 ... Z -> 26 AA -> 27 AB -> 28 ... 方法一 &#xff1a;进制转换 #方法一&#xff1a;进制转换 def convertToTi…

JDK项目分析的经验分享

基本类型的包装类(Character放在最后) String、StringBuffer、StringBuilder、StringJoiner、StringTokenizer(补充正则表达式的知识) CharacterIterator、StringCharacterIterator、CharsetProvider、CharsetEncoder、CharsetDecoder(较难) java.util.function下的函数表…

网络新闻发稿为何经久不衰?

有的老板可能看不到新闻营销的直接回报&#xff0c;一直不乐意在此方面投入&#xff0c;但是却看到竞争对手一直在搞新闻营销&#xff0c;也就安排个PR做做新闻公关。小马识途营销顾问观察&#xff0c;自互联网诞生以来&#xff0c;新闻营销一直是网络营销工作中的一个重点。 如…